diff options
author | Lei Zhang <thestig@chromium.org> | 2015-12-18 16:11:45 -0800 |
---|---|---|
committer | Lei Zhang <thestig@chromium.org> | 2015-12-18 16:11:45 -0800 |
commit | 4b84705b63eacb0140186983d55113f48d093f16 (patch) | |
tree | 40116931c6809fd90f495190e63a48404249ea3a /core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp | |
parent | b77959c00f986a9982a237f73864349593776e7b (diff) | |
download | pdfium-4b84705b63eacb0140186983d55113f48d093f16.tar.xz |
Merge to XFA: Fix the JBIG2 decoding regressions from commit bc4b82e and 8a9ce57.
BUG=566063
TBR=tsepez@chromium.org
Review URL: https://codereview.chromium.org/1534323002 .
(cherry picked from commit 20c8a9a66ea710b96493c9048fb65753e68b48fc)
Review URL: https://codereview.chromium.org/1540673003 .
Diffstat (limited to 'core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp')
-rw-r--r-- | core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp b/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp index 6b6f16109b..8aaebf46a2 100644 --- a/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp +++ b/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp @@ -103,15 +103,20 @@ int CJBig2_HuffmanTable::parseFromCodedBuffer(CJBig2_BitStream* pStream) { FX_DWORD HTLOW; FX_DWORD HTHIGH; if (pStream->readInteger(&HTLOW) == -1 || - pStream->readInteger(&HTHIGH) == -1 || HTLOW > HTHIGH) { + pStream->readInteger(&HTHIGH) == -1) { return FALSE; } + const int low = static_cast<int>(HTLOW); + const int high = static_cast<int>(HTHIGH); + if (low > high) + return false; + FX_DWORD nSize = 16; PREFLEN = FX_Alloc(int, nSize); RANGELEN = FX_Alloc(int, nSize); RANGELOW = FX_Alloc(int, nSize); - FX_DWORD CURRANGELOW = HTLOW; + int cur_low = low; NTEMP = 0; do { HT_CHECK_MEMORY_ADJUST @@ -119,23 +124,23 @@ int CJBig2_HuffmanTable::parseFromCodedBuffer(CJBig2_BitStream* pStream) { (pStream->readNBits(HTRS, &RANGELEN[NTEMP]) == -1)) { return FALSE; } - RANGELOW[NTEMP] = CURRANGELOW; - CURRANGELOW = CURRANGELOW + (1 << RANGELEN[NTEMP]); + RANGELOW[NTEMP] = cur_low; + cur_low += (1 << RANGELEN[NTEMP]); NTEMP = NTEMP + 1; - } while (CURRANGELOW < HTHIGH); + } while (cur_low < high); HT_CHECK_MEMORY_ADJUST if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) return FALSE; RANGELEN[NTEMP] = 32; - RANGELOW[NTEMP] = HTLOW - 1; + RANGELOW[NTEMP] = low - 1; ++NTEMP; HT_CHECK_MEMORY_ADJUST if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) return FALSE; RANGELEN[NTEMP] = 32; - RANGELOW[NTEMP] = HTHIGH; + RANGELOW[NTEMP] = high; NTEMP = NTEMP + 1; if (HTOOB) { HT_CHECK_MEMORY_ADJUST |