Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(95)

Side by Side Diff: core/fxcodec/jbig2/JBig2_GrrdProc.cpp

Issue 2202013002: Bound total pixels in JBig2 images to avoid overflows later. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Add tests Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 PDFium Authors. All rights reserved. 1 // Copyright 2015 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "core/fxcodec/jbig2/JBig2_GrrdProc.h" 7 #include "core/fxcodec/jbig2/JBig2_GrrdProc.h"
8 8
9 #include <memory> 9 #include <memory>
10 10
11 #include "core/fxcodec/jbig2/JBig2_ArithDecoder.h" 11 #include "core/fxcodec/jbig2/JBig2_ArithDecoder.h"
12 #include "core/fxcodec/jbig2/JBig2_BitStream.h" 12 #include "core/fxcodec/jbig2/JBig2_BitStream.h"
13 #include "core/fxcodec/jbig2/JBig2_Image.h" 13 #include "core/fxcodec/jbig2/JBig2_Image.h"
14 14
15 CJBig2_Image* CJBig2_GRRDProc::decode(CJBig2_ArithDecoder* pArithDecoder, 15 CJBig2_Image* CJBig2_GRRDProc::decode(CJBig2_ArithDecoder* pArithDecoder,
16 JBig2ArithCtx* grContext) { 16 JBig2ArithCtx* grContext) {
17 if (GRW == 0 || GRH == 0) 17 if (GRW == 0 || GRH == 0)
18 return new CJBig2_Image(GRW, GRH); 18 return new CJBig2_Image(GRW, GRH);
19 19
20 if (GRTEMPLATE == 0) { 20 if (GRTEMPLATE == 0) {
21 if ((GRAT[0] == -1) && (GRAT[1] == -1) && (GRAT[2] == -1) && 21 if ((GRAT[0] == -1) && (GRAT[1] == -1) && (GRAT[2] == -1) &&
22 (GRAT[3] == -1) && (GRREFERENCEDX == 0) && 22 (GRAT[3] == -1) && (GRREFERENCEDX == 0) &&
23 (GRW == (uint32_t)GRREFERENCE->m_nWidth)) { 23 (GRW == (uint32_t)GRREFERENCE->width())) {
24 return decode_Template0_opt(pArithDecoder, grContext); 24 return decode_Template0_opt(pArithDecoder, grContext);
25 } 25 }
26 return decode_Template0_unopt(pArithDecoder, grContext); 26 return decode_Template0_unopt(pArithDecoder, grContext);
27 } 27 }
28 28
29 if ((GRREFERENCEDX == 0) && (GRW == (uint32_t)GRREFERENCE->m_nWidth)) 29 if ((GRREFERENCEDX == 0) && (GRW == (uint32_t)GRREFERENCE->width()))
30 return decode_Template1_opt(pArithDecoder, grContext); 30 return decode_Template1_opt(pArithDecoder, grContext);
31 return decode_Template1_unopt(pArithDecoder, grContext); 31 return decode_Template1_unopt(pArithDecoder, grContext);
32 } 32 }
33 33
34 CJBig2_Image* CJBig2_GRRDProc::decode_Template0_unopt( 34 CJBig2_Image* CJBig2_GRRDProc::decode_Template0_unopt(
35 CJBig2_ArithDecoder* pArithDecoder, 35 CJBig2_ArithDecoder* pArithDecoder,
36 JBig2ArithCtx* grContext) { 36 JBig2ArithCtx* grContext) {
37 FX_BOOL LTP = FALSE; 37 FX_BOOL LTP = FALSE;
38 std::unique_ptr<CJBig2_Image> GRREG(new CJBig2_Image(GRW, GRH)); 38 std::unique_ptr<CJBig2_Image> GRREG(new CJBig2_Image(GRW, GRH));
39 GRREG->fill(0); 39 GRREG->fill(0);
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 155
156 int32_t iGRW = static_cast<int32_t>(GRW); 156 int32_t iGRW = static_cast<int32_t>(GRW);
157 int32_t iGRH = static_cast<int32_t>(GRH); 157 int32_t iGRH = static_cast<int32_t>(GRH);
158 std::unique_ptr<CJBig2_Image> GRREG(new CJBig2_Image(iGRW, iGRH)); 158 std::unique_ptr<CJBig2_Image> GRREG(new CJBig2_Image(iGRW, iGRH));
159 if (!GRREG->m_pData) 159 if (!GRREG->m_pData)
160 return nullptr; 160 return nullptr;
161 161
162 FX_BOOL LTP = FALSE; 162 FX_BOOL LTP = FALSE;
163 uint8_t* pLine = GRREG->m_pData; 163 uint8_t* pLine = GRREG->m_pData;
164 uint8_t* pLineR = GRREFERENCE->m_pData; 164 uint8_t* pLineR = GRREFERENCE->m_pData;
165 intptr_t nStride = GRREG->m_nStride; 165 intptr_t nStride = GRREG->stride();
166 intptr_t nStrideR = GRREFERENCE->m_nStride; 166 intptr_t nStrideR = GRREFERENCE->stride();
167 int32_t GRWR = GRREFERENCE->m_nWidth; 167 int32_t GRWR = GRREFERENCE->width();
168 int32_t GRHR = GRREFERENCE->m_nHeight; 168 int32_t GRHR = GRREFERENCE->height();
169 if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) 169 if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1)
170 GRREFERENCEDY = 0; 170 GRREFERENCEDY = 0;
171 intptr_t nOffset = -GRREFERENCEDY * nStrideR; 171 intptr_t nOffset = -GRREFERENCEDY * nStrideR;
172 for (int32_t h = 0; h < iGRH; h++) { 172 for (int32_t h = 0; h < iGRH; h++) {
173 if (TPGRON) 173 if (TPGRON)
174 LTP = LTP ^ pArithDecoder->DECODE(&grContext[0x0010]); 174 LTP = LTP ^ pArithDecoder->DECODE(&grContext[0x0010]);
175 uint32_t line1 = (h > 0) ? pLine[-nStride] << 4 : 0; 175 uint32_t line1 = (h > 0) ? pLine[-nStride] << 4 : 0;
176 int32_t reference_h = h - GRREFERENCEDY; 176 int32_t reference_h = h - GRREFERENCEDY;
177 FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1); 177 FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1);
178 FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR); 178 FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR);
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 389
390 int32_t iGRW = static_cast<int32_t>(GRW); 390 int32_t iGRW = static_cast<int32_t>(GRW);
391 int32_t iGRH = static_cast<int32_t>(GRH); 391 int32_t iGRH = static_cast<int32_t>(GRH);
392 std::unique_ptr<CJBig2_Image> GRREG(new CJBig2_Image(iGRW, iGRH)); 392 std::unique_ptr<CJBig2_Image> GRREG(new CJBig2_Image(iGRW, iGRH));
393 if (!GRREG->m_pData) 393 if (!GRREG->m_pData)
394 return nullptr; 394 return nullptr;
395 395
396 FX_BOOL LTP = FALSE; 396 FX_BOOL LTP = FALSE;
397 uint8_t* pLine = GRREG->m_pData; 397 uint8_t* pLine = GRREG->m_pData;
398 uint8_t* pLineR = GRREFERENCE->m_pData; 398 uint8_t* pLineR = GRREFERENCE->m_pData;
399 intptr_t nStride = GRREG->m_nStride; 399 intptr_t nStride = GRREG->stride();
400 intptr_t nStrideR = GRREFERENCE->m_nStride; 400 intptr_t nStrideR = GRREFERENCE->stride();
401 int32_t GRWR = GRREFERENCE->m_nWidth; 401 int32_t GRWR = GRREFERENCE->width();
402 int32_t GRHR = GRREFERENCE->m_nHeight; 402 int32_t GRHR = GRREFERENCE->height();
403 if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) { 403 if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) {
404 GRREFERENCEDY = 0; 404 GRREFERENCEDY = 0;
405 } 405 }
406 intptr_t nOffset = -GRREFERENCEDY * nStrideR; 406 intptr_t nOffset = -GRREFERENCEDY * nStrideR;
407 for (int32_t h = 0; h < iGRH; h++) { 407 for (int32_t h = 0; h < iGRH; h++) {
408 if (TPGRON) 408 if (TPGRON)
409 LTP = LTP ^ pArithDecoder->DECODE(&grContext[0x0008]); 409 LTP = LTP ^ pArithDecoder->DECODE(&grContext[0x0008]);
410 uint32_t line1 = (h > 0) ? pLine[-nStride] << 1 : 0; 410 uint32_t line1 = (h > 0) ? pLine[-nStride] << 1 : 0;
411 int32_t reference_h = h - GRREFERENCEDY; 411 int32_t reference_h = h - GRREFERENCEDY;
412 FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1); 412 FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1);
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
494 pLine[w >> 3] = cVal; 494 pLine[w >> 3] = cVal;
495 } 495 }
496 } 496 }
497 pLine += nStride; 497 pLine += nStride;
498 if (h < GRHR + GRREFERENCEDY) { 498 if (h < GRHR + GRREFERENCEDY) {
499 pLineR += nStrideR; 499 pLineR += nStrideR;
500 } 500 }
501 } 501 }
502 return GRREG.release(); 502 return GRREG.release();
503 } 503 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698