Patch to bug 11724. Fix suspec`ious buffer overrun problem. It prevents
double byte Ja texts in DTD being loaded correctly. git-svn-id: svn://10.0.0.236/trunk@44887 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -557,17 +557,26 @@ nsresult nsExpatTokenizer::LoadStream(nsIInputStream* in,
|
||||
if (NS_FAILED(res)) return res;
|
||||
|
||||
PRUint32 aReadCount = 0;
|
||||
uniBuf = (PRUnichar *) PR_Malloc(bufsize);
|
||||
PRUnichar *aBuf = (PRUnichar *) PR_Malloc(bufsize);
|
||||
|
||||
while (NS_OK == (res=uniIn->Read(uniBuf, retLen, aCount, &aReadCount))) {
|
||||
retLen += aReadCount;
|
||||
while (NS_OK == (res=uniIn->Read(aBuf, retLen, aCount, &aReadCount))) {
|
||||
retLen += aReadCount;
|
||||
#if 1
|
||||
bufsize += aCount * sizeof(PRUnichar);
|
||||
aBuf = (PRUnichar *) PR_Realloc(aBuf, bufsize);
|
||||
#else
|
||||
if (((aReadCount+32) >= aCount) &&
|
||||
((retLen+aCount) >= bufsize)) {
|
||||
((retLen+aCount) * sizeof(PRUnichar) >= bufsize)) {
|
||||
|
||||
bufsize += aCount;
|
||||
bufsize += aCount * sizeof(PRUnichar);
|
||||
uniBuf = (PRUnichar *) PR_Realloc(uniBuf, bufsize*sizeof(PRUnichar));
|
||||
}
|
||||
#endif
|
||||
}/* while */
|
||||
uniBuf = (PRUnichar *) PR_Malloc(retLen*sizeof(PRUnichar));
|
||||
nsCRT::memcpy(uniBuf, aBuf, sizeof(PRUnichar) * retLen);
|
||||
PR_FREEIF(aBuf);
|
||||
|
||||
if (NS_BASE_STREAM_EOF == res)
|
||||
res = NS_OK;
|
||||
return res;
|
||||
|
||||
@@ -557,17 +557,26 @@ nsresult nsExpatTokenizer::LoadStream(nsIInputStream* in,
|
||||
if (NS_FAILED(res)) return res;
|
||||
|
||||
PRUint32 aReadCount = 0;
|
||||
uniBuf = (PRUnichar *) PR_Malloc(bufsize);
|
||||
PRUnichar *aBuf = (PRUnichar *) PR_Malloc(bufsize);
|
||||
|
||||
while (NS_OK == (res=uniIn->Read(uniBuf, retLen, aCount, &aReadCount))) {
|
||||
retLen += aReadCount;
|
||||
while (NS_OK == (res=uniIn->Read(aBuf, retLen, aCount, &aReadCount))) {
|
||||
retLen += aReadCount;
|
||||
#if 1
|
||||
bufsize += aCount * sizeof(PRUnichar);
|
||||
aBuf = (PRUnichar *) PR_Realloc(aBuf, bufsize);
|
||||
#else
|
||||
if (((aReadCount+32) >= aCount) &&
|
||||
((retLen+aCount) >= bufsize)) {
|
||||
((retLen+aCount) * sizeof(PRUnichar) >= bufsize)) {
|
||||
|
||||
bufsize += aCount;
|
||||
bufsize += aCount * sizeof(PRUnichar);
|
||||
uniBuf = (PRUnichar *) PR_Realloc(uniBuf, bufsize*sizeof(PRUnichar));
|
||||
}
|
||||
#endif
|
||||
}/* while */
|
||||
uniBuf = (PRUnichar *) PR_Malloc(retLen*sizeof(PRUnichar));
|
||||
nsCRT::memcpy(uniBuf, aBuf, sizeof(PRUnichar) * retLen);
|
||||
PR_FREEIF(aBuf);
|
||||
|
||||
if (NS_BASE_STREAM_EOF == res)
|
||||
res = NS_OK;
|
||||
return res;
|
||||
|
||||
Reference in New Issue
Block a user