Bug 399706, glibc detected: free(): invalid pointer attempting to select cert

Landing better patch.
r=rrelyea, a/blocking=beltzner


git-svn-id: svn://10.0.0.236/trunk@239058 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
kaie%kuix.de
2007-11-09 15:09:58 +00:00
parent d78c04ef1b
commit fcf4bc4731

View File

@@ -456,44 +456,47 @@ nsNSSCertificate::FormatUIStrings(const nsAutoString &nickname, nsAutoString &ni
details.Append(PRUnichar('\n'));
}
PRUint32 num;
PRUnichar **emailArray = NULL;
if (NS_SUCCEEDED(GetEmailAddresses(&num, &emailArray)) && num > 0) {
PRUnichar **emailAddr = emailArray;
details.AppendLiteral(" ");
if (NS_SUCCEEDED(nssComponent->GetPIPNSSBundleString("CertInfoEmail", info))) {
details.Append(info);
details.AppendLiteral(": ");
}
details.Append(*emailAddr);
nsAutoString firstEmail;
const char *aWalkAddr;
for (aWalkAddr = CERT_GetFirstEmailAddress(mCert)
;
aWalkAddr
;
aWalkAddr = CERT_GetNextEmailAddress(mCert, aWalkAddr))
{
NS_ConvertUTF8toUTF16 email(aWalkAddr);
if (email.IsEmpty())
continue;
/*
* If the first email address from the subject DN is also present
* in the subjectAltName extension, GetEmailAddresses() will return
* it twice (as received from NSS). Remember the first address so that
* we can filter out duplicates later on.
*/
PRUnichar *firstEmail = *emailAddr;
emailAddr++;
num--;
if (firstEmail.IsEmpty()) {
/*
* If the first email address from the subject DN is also present
* in the subjectAltName extension, GetEmailAddresses() will return
* it twice (as received from NSS). Remember the first address so that
* we can filter out duplicates later on.
*/
firstEmail = email;
/* append remaining addresses */
while (num > 0) {
if (!nsDependentString(firstEmail).Equals(nsDependentString(*emailAddr))) {
details.AppendLiteral(", ");
details.Append(*emailAddr);
details.AppendLiteral(" ");
if (NS_SUCCEEDED(nssComponent->GetPIPNSSBundleString("CertInfoEmail", info))) {
details.Append(info);
details.AppendLiteral(": ");
}
details.Append(email);
}
else {
// Append current address if it's different from the first one.
if (!firstEmail.Equals(email)) {
details.AppendLiteral(", ");
details.Append(email);
}
nsMemory::Free(*emailAddr);
*emailAddr = nsnull;
emailAddr++;
num--;
}
details.Append(PRUnichar('\n'));
nsMemory::Free(firstEmail);
}
nsMemory::Free(emailArray);
emailArray = nsnull;
if (!firstEmail.IsEmpty()) {
// We got at least one email address, so we want a newline
details.Append(PRUnichar('\n'));
}
if (NS_SUCCEEDED(nssComponent->GetPIPNSSBundleString("CertInfoIssuedBy", info))) {
details.Append(info);