tag 586577 + patch severity 586577 important thanks Am 2010-06-29 18:23, schrieb Tim Riemenschneider: > As a workaround, it works if I install the upsteam-binary instead of the > debian version > (i.e. download the xpi from http://enigmail.mozdev.org/download/index.php ) > > Suggestion comes from ubuntu, which is also affected by this, see: > https://bugs.launchpad.net/ubuntu/+source/enigmail/+bug/565014 > > (so it seems debian/ubuntu-specific)
Yes, I know the Ubuntu bug report. The good news is that I wrote a patch that fixes the problem as far as I've tested. (Attached) Comments welcome. WM
Index: enigmail-1.0.1/extensions/enigmail/src/nsEnigMimeListener.cpp =================================================================== --- enigmail-1.0.1.orig/extensions/enigmail/src/nsEnigMimeListener.cpp 2010-06-29 22:14:37.000000000 +0200 +++ enigmail-1.0.1/extensions/enigmail/src/nsEnigMimeListener.cpp 2010-06-29 22:24:40.000000000 +0200 @@ -675,17 +675,33 @@ } static void -__ReplaceCSubstring (nsACString &string, const char* replace, const char* with) +__ReplaceCSubstring (nsACString &str, const char* replace, const char* with) { - PRInt32 i = string.Find (replace); - string.Replace (i, strlen (replace), with); + //Modeled after nsTStringObsolete's ReplaceSubstring implementation + + if(strlen(replace) == 0) + return; + + PRInt32 i = 0; + while(i < str.Length()) { + PRInt32 r = str.Find(replace, strlen(replace)); + if(r == -1) + break; + str.Replace(r, strlen(replace), with, strlen(with)); + i = r + strlen(with); + } + } static void -__ReplaceCChar (nsACString &string, const char replace, const char with) +__ReplaceCChar (nsACString &str, const char replace, const char with) { - PRInt32 i = string.FindChar (replace); - string.Replace (i, 1, (const char*) &with, 1); + PRInt32 i = 0; + while(i < str.Length()) { + if(str[i] == replace) + str.Replace(i,1, &with, 1); + ++i; + } } void @@ -772,11 +788,11 @@ return; // Extract header key (not case-sensitive) - nsCAutoString headerKey = (nsCString) nsDependentCSubstring (headerStr, colonOffset); + nsCAutoString headerKey = (nsCString) nsDependentCSubstring (headerStr, 0, colonOffset); ToLowerCase(headerKey); // Extract header value, trimming leading/trailing whitespace - nsCAutoString buf = (nsCString) nsDependentCSubstring (headerStr, colonOffset, headerStr.Length() - colonOffset); + nsCAutoString buf = (nsCString) nsDependentCSubstring (headerStr, colonOffset + 1, headerStr.Length() - colonOffset - 1); buf.Trim(" "); //DEBUG_LOG(("nsEnigMimeListener::ParseHeader: %s: %s\n", headerKey.get(), buf.get())); @@ -790,7 +806,7 @@ } else { // Extract value to left of parameters - headerValue = nsDependentCSubstring (buf, semicolonOffset); + headerValue = nsDependentCSubstring (buf, 0, semicolonOffset); } // Trim leading and trailing spaces in header value Index: enigmail-1.0.1/extensions/enigmail/src/nsEnigMimeService.cpp =================================================================== --- enigmail-1.0.1.orig/extensions/enigmail/src/nsEnigMimeService.cpp 2010-06-29 22:14:37.000000000 +0200 +++ enigmail-1.0.1/extensions/enigmail/src/nsEnigMimeService.cpp 2010-06-29 22:14:37.000000000 +0200 @@ -218,8 +218,12 @@ static void __ReplaceChar (nsAString &string, const PRUnichar replace, const PRUnichar with) { - PRInt32 i = string.FindChar (replace); - string.Replace (i, 1, &with, 1); + PRInt32 i = 0; + while(i < string.Length()) { + if(string[i] == replace) + string.Replace(i,1, &with, 1); + ++i; + } } NS_IMETHODIMP