Bug 283067 Allocation/free mismatch in base/search/src/nsMsgSearchAdapter.cpp

patch by Mikael Parknert <mikael@parknert.se> r=mscott sr=bienvenu
This commit is contained in:
cbiesinger%web.de 2005-04-05 18:14:36 +00:00
Родитель 80cee11c11
Коммит 94acc8eb7e
1 изменённых файлов: 17 добавлений и 57 удалений

Просмотреть файл

@ -404,7 +404,7 @@ nsresult nsMsgSearchAdapter::EncodeImapTerm (nsIMsgSearchTerm *term, PRBool real
PRBool useQuotes = PR_FALSE; PRBool useQuotes = PR_FALSE;
PRBool excludeHeader = PR_FALSE; PRBool excludeHeader = PR_FALSE;
PRBool ignoreValue = PR_FALSE; PRBool ignoreValue = PR_FALSE;
char *arbitraryHeader = nsnull; nsCAutoString arbitraryHeader;
const char *whichMnemonic = nsnull; const char *whichMnemonic = nsnull;
const char *orHeaderMnemonic = nsnull; const char *orHeaderMnemonic = nsnull;
@ -540,14 +540,10 @@ nsresult nsMsgSearchAdapter::EncodeImapTerm (nsIMsgSearchTerm *term, PRBool real
term->GetArbitraryHeader(getter_Copies(arbitraryHeaderTerm)); term->GetArbitraryHeader(getter_Copies(arbitraryHeaderTerm));
if (!arbitraryHeaderTerm.IsEmpty()) if (!arbitraryHeaderTerm.IsEmpty())
{ {
arbitraryHeader = new char [strlen((const char *)arbitraryHeaderTerm) + 6]; // 6 bytes for SPACE \" .... \" SPACE arbitraryHeader.AssignLiteral(" \"");
if (!arbitraryHeader) arbitraryHeader.Append(arbitraryHeaderTerm);
return NS_ERROR_OUT_OF_MEMORY; arbitraryHeader.AppendLiteral("\" ");
arbitraryHeader[0] = '\0'; whichMnemonic = arbitraryHeader.get();
PL_strcat(arbitraryHeader, " \"");
PL_strcat(arbitraryHeader, (const char *)arbitraryHeaderTerm);
PL_strcat(arbitraryHeader, "\" ");
whichMnemonic = arbitraryHeader;
} }
else else
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
@ -735,8 +731,6 @@ nsresult nsMsgSearchAdapter::EncodeImapTerm (nsIMsgSearchTerm *term, PRBool real
if (value && valueWasAllocated) if (value && valueWasAllocated)
PR_Free (value); PR_Free (value);
if (arbitraryHeader)
delete arbitraryHeader;
*ppOutTerm = encoding; *ppOutTerm = encoding;
@ -784,12 +778,7 @@ nsresult nsMsgSearchAdapter::EncodeImap (char **ppOutEncoding, nsISupportsArray
PRUint32 termCount; PRUint32 termCount;
searchTerms->Count(&termCount); searchTerms->Count(&termCount);
PRUint32 i = 0; PRUint32 i = 0;
int encodingLength = 0;
// Build up an array of encodings, one per query term
char **termEncodings = new char *[termCount];
if (!termEncodings)
return NS_ERROR_OUT_OF_MEMORY;
// create our expression // create our expression
nsMsgSearchBoolExpression * expression = new nsMsgSearchBoolExpression(); nsMsgSearchBoolExpression * expression = new nsMsgSearchBoolExpression();
if (!expression) if (!expression)
@ -797,60 +786,31 @@ nsresult nsMsgSearchAdapter::EncodeImap (char **ppOutEncoding, nsISupportsArray
for (i = 0; i < termCount && NS_SUCCEEDED(err); i++) for (i = 0; i < termCount && NS_SUCCEEDED(err); i++)
{ {
char *termEncoding;
nsCOMPtr<nsIMsgSearchTerm> pTerm; nsCOMPtr<nsIMsgSearchTerm> pTerm;
searchTerms->QueryElementAt(i, NS_GET_IID(nsIMsgSearchTerm), searchTerms->QueryElementAt(i, NS_GET_IID(nsIMsgSearchTerm),
(void **)getter_AddRefs(pTerm)); (void **)getter_AddRefs(pTerm));
err = EncodeImapTerm (pTerm, reallyDredd, srcCharset, destCharset, &termEncodings[i]); err = EncodeImapTerm (pTerm, reallyDredd, srcCharset, destCharset, &termEncoding);
if (NS_SUCCEEDED(err) && nsnull != termEncodings[i]) if (NS_SUCCEEDED(err) && nsnull != termEncoding)
{ {
encodingLength += strlen(termEncodings[i]) + 1; expression = nsMsgSearchBoolExpression::AddSearchTermWithEncoding(expression, pTerm, termEncoding);
expression = nsMsgSearchBoolExpression::AddSearchTermWithEncoding(expression, pTerm,termEncodings[i]); delete [] termEncoding;
} }
} }
if (NS_SUCCEEDED(err)) if (NS_SUCCEEDED(err))
{ {
// Catenate the intermediate encodings together into a big string // Catenate the intermediate encodings together into a big string
char *totalEncoding = new char [encodingLength + (!reallyDredd ? strlen(m_kImapUnDeleted) : 0) + 1]; nsCAutoString encodingBuff;
nsCString encodingBuff;
if (totalEncoding)
{
totalEncoding[0] = '\0';
int offset = 0; // offset into starting place for the buffer
if (!reallyDredd)
PL_strcat(totalEncoding, m_kImapUnDeleted);
if (!reallyDredd) if (!reallyDredd)
{
encodingBuff.Append(m_kImapUnDeleted); encodingBuff.Append(m_kImapUnDeleted);
offset = strlen(m_kImapUnDeleted);
}
expression->GenerateEncodeStr(&encodingBuff); expression->GenerateEncodeStr(&encodingBuff);
for (i = 0; i < termCount; i++)
{
if (termEncodings[i])
{
PL_strcat (totalEncoding, termEncodings[i]);
delete [] termEncodings[i];
}
}
}
else
err = NS_ERROR_OUT_OF_MEMORY;
delete totalEncoding;
delete expression;
// Set output parameter if we encoded the query successfully
if (NS_SUCCEEDED(err))
*ppOutEncoding = ToNewCString(encodingBuff); *ppOutEncoding = ToNewCString(encodingBuff);
} }
delete [] termEncodings; delete expression;
return err; return err;
} }