bug 607160 - check text length computations. r=roc a=blocking2.0

This commit is contained in:
Jonathan Kew 2010-11-25 15:36:53 +00:00
Родитель 54a163c875
Коммит c9ec94c809
1 изменённых файлов: 13 добавлений и 3 удалений

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

@ -866,6 +866,7 @@ private:
// on the line, or null if there was no previous leaf frame. // on the line, or null if there was no previous leaf frame.
nsIFrame* mCommonAncestorWithLastFrame; nsIFrame* mCommonAncestorWithLastFrame;
// mMaxTextLength is an upper bound on the size of the text in all mapped frames // mMaxTextLength is an upper bound on the size of the text in all mapped frames
// The value PR_UINT32_MAX represents overflow; text will be discarded
PRUint32 mMaxTextLength; PRUint32 mMaxTextLength;
PRPackedBool mDoubleByteText; PRPackedBool mDoubleByteText;
PRPackedBool mBidiEnabled; PRPackedBool mBidiEnabled;
@ -1294,8 +1295,11 @@ void BuildTextRunsScanner::FlushFrames(PRBool aFlushLineBreaks, PRBool aSuppress
} }
} else { } else {
nsAutoTArray<PRUint8,BIG_TEXT_NODE_SIZE> buffer; nsAutoTArray<PRUint8,BIG_TEXT_NODE_SIZE> buffer;
if (!buffer.AppendElements(mMaxTextLength*(mDoubleByteText ? 2 : 1))) PRUint32 bufferSize = mMaxTextLength*(mDoubleByteText ? 2 : 1);
if (bufferSize < mMaxTextLength || bufferSize == PR_UINT32_MAX ||
!buffer.AppendElements(bufferSize)) {
return; return;
}
textRun = BuildTextRunForFrames(buffer.Elements()); textRun = BuildTextRunForFrames(buffer.Elements());
} }
} }
@ -1339,8 +1343,14 @@ void BuildTextRunsScanner::FlushLineBreaks(gfxTextRun* aTrailingTextRun)
void BuildTextRunsScanner::AccumulateRunInfo(nsTextFrame* aFrame) void BuildTextRunsScanner::AccumulateRunInfo(nsTextFrame* aFrame)
{ {
NS_ASSERTION(mMaxTextLength <= mMaxTextLength + aFrame->GetContentLength(), "integer overflow"); if (mMaxTextLength != PR_UINT32_MAX) {
mMaxTextLength += aFrame->GetContentLength(); NS_ASSERTION(mMaxTextLength < PR_UINT32_MAX - aFrame->GetContentLength(), "integer overflow");
if (mMaxTextLength >= PR_UINT32_MAX - aFrame->GetContentLength()) {
mMaxTextLength = PR_UINT32_MAX;
} else {
mMaxTextLength += aFrame->GetContentLength();
}
}
mDoubleByteText |= aFrame->GetContent()->GetText()->Is2b(); mDoubleByteText |= aFrame->GetContent()->GetText()->Is2b();
mLastFrame = aFrame; mLastFrame = aFrame;
mCommonAncestorWithLastFrame = aFrame->GetParent(); mCommonAncestorWithLastFrame = aFrame->GetParent();