зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
80cee11c11
Коммит
94acc8eb7e
|
@ -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)
|
if (!reallyDredd)
|
||||||
{
|
encodingBuff.Append(m_kImapUnDeleted);
|
||||||
totalEncoding[0] = '\0';
|
|
||||||
|
|
||||||
int offset = 0; // offset into starting place for the buffer
|
expression->GenerateEncodeStr(&encodingBuff);
|
||||||
if (!reallyDredd)
|
*ppOutEncoding = ToNewCString(encodingBuff);
|
||||||
PL_strcat(totalEncoding, m_kImapUnDeleted);
|
|
||||||
|
|
||||||
if (!reallyDredd)
|
|
||||||
{
|
|
||||||
encodingBuff.Append(m_kImapUnDeleted);
|
|
||||||
offset = strlen(m_kImapUnDeleted);
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
delete [] termEncodings;
|
delete expression;
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче