| Index: core/src/fxcodec/jbig2/JBig2_Image.cpp
|
| diff --git a/core/src/fxcodec/jbig2/JBig2_Image.cpp b/core/src/fxcodec/jbig2/JBig2_Image.cpp
|
| index 03929b84c867d60ad02be257df78f304d4dcef42..8e27bca80cc6824fdad6ccd32dff358f4b6a5b3b 100644
|
| --- a/core/src/fxcodec/jbig2/JBig2_Image.cpp
|
| +++ b/core/src/fxcodec/jbig2/JBig2_Image.cpp
|
| @@ -767,18 +767,25 @@ CJBig2_Image *CJBig2_Image::subImage(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT3
|
| }
|
| void CJBig2_Image::expand(FX_INT32 h, FX_BOOL v)
|
| {
|
| - if (!m_pData) {
|
| + if (!m_pData || h <= m_nHeight) {
|
| return;
|
| }
|
| - FX_SAFE_DWORD safeMemSize = pdfium::base::checked_cast<FX_DWORD>(h);
|
| - safeMemSize *= pdfium::base::checked_cast<FX_DWORD>(m_nStride);
|
| + FX_DWORD dwH = pdfium::base::checked_cast<FX_DWORD>(h);
|
| + FX_DWORD dwStride = pdfium::base::checked_cast<FX_DWORD>(m_nStride);
|
| + FX_DWORD dwHeight = pdfium::base::checked_cast<FX_DWORD>(m_nHeight);
|
| + FX_SAFE_DWORD safeMemSize = dwH;
|
| + safeMemSize *= dwStride;
|
| if (!safeMemSize.IsValid()) {
|
| return;
|
| }
|
| + //The guaranteed reallocated memory is to be < 4GB (unsigned int).
|
| m_pData = (FX_BYTE*)m_pModule->JBig2_Realloc(m_pData, safeMemSize.ValueOrDie());
|
| - if(h > m_nHeight) {
|
| - JBIG2_memset(m_pData + m_nHeight * m_nStride, v ? 0xff : 0, (h - m_nHeight)*m_nStride);
|
| - }
|
| + //The result of dwHeight * dwStride doesn't overflow after the
|
| + //checking of safeMemSize.
|
| + //The same as the result of (dwH - dwHeight) * dwStride) because
|
| + //dwH - dwHeight is always less than dwH(h) which is checked in
|
| + //the calculation of dwH * dwStride.
|
| + JBIG2_memset(m_pData + dwHeight * dwStride, v ? 0xff : 0, (dwH - dwHeight) * dwStride);
|
| m_nHeight = h;
|
| }
|
| FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
|
|
|