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

Side by Side Diff: core/src/fxcodec/jbig2/JBig2_TrdProc.cpp

Issue 1384663007: Fix regression in JBIG2 decoding from commit ce37d73. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: grammar school Created 5 years, 2 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
« no previous file with comments | « core/src/fxcodec/jbig2/JBig2_SddProc.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "JBig2_TrdProc.h" 7 #include "JBig2_TrdProc.h"
8 8
9 #include "../../../../third_party/base/nonstd_unique_ptr.h" 9 #include "../../../../third_party/base/nonstd_unique_ptr.h"
10 #include "JBig2_ArithDecoder.h" 10 #include "JBig2_ArithDecoder.h"
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 int32_t DT, DFS, CURS; 219 int32_t DT, DFS, CURS;
220 int32_t SI, TI; 220 int32_t SI, TI;
221 CJBig2_Image* IBI; 221 CJBig2_Image* IBI;
222 FX_DWORD WI, HI; 222 FX_DWORD WI, HI;
223 int32_t IDS; 223 int32_t IDS;
224 int RI; 224 int RI;
225 int32_t RDWI, RDHI, RDXI, RDYI; 225 int32_t RDWI, RDHI, RDXI, RDYI;
226 CJBig2_Image* IBOI; 226 CJBig2_Image* IBOI;
227 FX_DWORD WOI, HOI; 227 FX_DWORD WOI, HOI;
228 FX_BOOL bFirst; 228 FX_BOOL bFirst;
229 int32_t nRet;
230 int32_t bRetained; 229 int32_t bRetained;
231 CJBig2_ArithIntDecoder* IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH, 230 CJBig2_ArithIntDecoder* IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH,
232 *IARDX, *IARDY; 231 *IARDX, *IARDY;
233 CJBig2_ArithIaidDecoder* IAID; 232 CJBig2_ArithIaidDecoder* IAID;
234 if (pIDS) { 233 if (pIDS) {
235 IADT = pIDS->IADT; 234 IADT = pIDS->IADT;
236 IAFS = pIDS->IAFS; 235 IAFS = pIDS->IAFS;
237 IADS = pIDS->IADS; 236 IADS = pIDS->IADS;
238 IAIT = pIDS->IAIT; 237 IAIT = pIDS->IAIT;
239 IARI = pIDS->IARI; 238 IARI = pIDS->IARI;
(...skipping 11 matching lines...) Expand all
251 IARI = new CJBig2_ArithIntDecoder(); 250 IARI = new CJBig2_ArithIntDecoder();
252 IARDW = new CJBig2_ArithIntDecoder(); 251 IARDW = new CJBig2_ArithIntDecoder();
253 IARDH = new CJBig2_ArithIntDecoder(); 252 IARDH = new CJBig2_ArithIntDecoder();
254 IARDX = new CJBig2_ArithIntDecoder(); 253 IARDX = new CJBig2_ArithIntDecoder();
255 IARDY = new CJBig2_ArithIntDecoder(); 254 IARDY = new CJBig2_ArithIntDecoder();
256 IAID = new CJBig2_ArithIaidDecoder(SBSYMCODELEN); 255 IAID = new CJBig2_ArithIaidDecoder(SBSYMCODELEN);
257 bRetained = FALSE; 256 bRetained = FALSE;
258 } 257 }
259 nonstd::unique_ptr<CJBig2_Image> SBREG(new CJBig2_Image(SBW, SBH)); 258 nonstd::unique_ptr<CJBig2_Image> SBREG(new CJBig2_Image(SBW, SBH));
260 SBREG->fill(SBDEFPIXEL); 259 SBREG->fill(SBDEFPIXEL);
261 if (!IADT->decode(pArithDecoder, &STRIPT)) { 260 IADT->decode(pArithDecoder, &STRIPT);
262 goto failed;
263 }
264 STRIPT *= SBSTRIPS; 261 STRIPT *= SBSTRIPS;
265 STRIPT = -STRIPT; 262 STRIPT = -STRIPT;
266 FIRSTS = 0; 263 FIRSTS = 0;
267 NINSTANCES = 0; 264 NINSTANCES = 0;
268 while (NINSTANCES < SBNUMINSTANCES) { 265 while (NINSTANCES < SBNUMINSTANCES) {
269 if (!IADT->decode(pArithDecoder, &DT)) { 266 IADT->decode(pArithDecoder, &DT);
270 goto failed;
271 }
272 DT *= SBSTRIPS; 267 DT *= SBSTRIPS;
273 STRIPT = STRIPT + DT; 268 STRIPT = STRIPT + DT;
274 bFirst = TRUE; 269 bFirst = TRUE;
275 for (;;) { 270 for (;;) {
276 if (bFirst) { 271 if (bFirst) {
277 if (!IAFS->decode(pArithDecoder, &DFS)) { 272 IAFS->decode(pArithDecoder, &DFS);
278 goto failed;
279 }
280 FIRSTS = FIRSTS + DFS; 273 FIRSTS = FIRSTS + DFS;
281 CURS = FIRSTS; 274 CURS = FIRSTS;
282 bFirst = FALSE; 275 bFirst = FALSE;
283 } else { 276 } else {
284 nRet = IADS->decode(pArithDecoder, &IDS); 277 if (!IADS->decode(pArithDecoder, &IDS))
285 if (nRet == JBIG2_OOB) {
286 break; 278 break;
287 } else if (nRet != 0) { 279 CURS = CURS + IDS + SBDSOFFSET;
288 goto failed;
289 } else {
290 CURS = CURS + IDS + SBDSOFFSET;
291 }
292 } 280 }
293 if (NINSTANCES >= SBNUMINSTANCES) { 281 if (NINSTANCES >= SBNUMINSTANCES) {
294 break; 282 break;
295 } 283 }
296 int CURT = 0; 284 int CURT = 0;
297 if (SBSTRIPS != 1) { 285 if (SBSTRIPS != 1)
298 if (!IAIT->decode(pArithDecoder, &CURT)) { 286 IAIT->decode(pArithDecoder, &CURT);
299 goto failed; 287
300 }
301 }
302 TI = STRIPT + CURT; 288 TI = STRIPT + CURT;
303 FX_DWORD IDI; 289 FX_DWORD IDI;
304 IAID->decode(pArithDecoder, &IDI); 290 IAID->decode(pArithDecoder, &IDI);
305 if (IDI >= SBNUMSYMS) { 291 if (IDI >= SBNUMSYMS)
306 goto failed; 292 goto failed;
307 } 293
308 if (SBREFINE == 0) { 294 if (SBREFINE == 0)
309 RI = 0; 295 RI = 0;
310 } else { 296 else
311 if (!IARI->decode(pArithDecoder, &RI)) { 297 IARI->decode(pArithDecoder, &RI);
312 goto failed; 298
313 } 299 if (!SBSYMS[IDI])
314 }
315 if (!SBSYMS[IDI]) {
316 goto failed; 300 goto failed;
317 } 301
318 if (RI == 0) { 302 if (RI == 0) {
319 IBI = SBSYMS[IDI]; 303 IBI = SBSYMS[IDI];
320 } else { 304 } else {
321 if (!IARDW->decode(pArithDecoder, &RDWI) || 305 IARDW->decode(pArithDecoder, &RDWI);
322 !IARDH->decode(pArithDecoder, &RDHI) || 306 IARDH->decode(pArithDecoder, &RDHI);
323 !IARDX->decode(pArithDecoder, &RDXI) || 307 IARDX->decode(pArithDecoder, &RDXI);
324 !IARDY->decode(pArithDecoder, &RDYI)) { 308 IARDY->decode(pArithDecoder, &RDYI);
325 goto failed;
326 }
327 IBOI = SBSYMS[IDI]; 309 IBOI = SBSYMS[IDI];
328 WOI = IBOI->m_nWidth; 310 WOI = IBOI->m_nWidth;
329 HOI = IBOI->m_nHeight; 311 HOI = IBOI->m_nHeight;
330 if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) { 312 if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) {
331 goto failed; 313 goto failed;
332 } 314 }
333 nonstd::unique_ptr<CJBig2_GRRDProc> pGRRD(new CJBig2_GRRDProc()); 315 nonstd::unique_ptr<CJBig2_GRRDProc> pGRRD(new CJBig2_GRRDProc());
334 pGRRD->GRW = WOI + RDWI; 316 pGRRD->GRW = WOI + RDWI;
335 pGRRD->GRH = HOI + RDHI; 317 pGRRD->GRH = HOI + RDHI;
336 pGRRD->GRTEMPLATE = SBRTEMPLATE; 318 pGRRD->GRTEMPLATE = SBRTEMPLATE;
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
421 delete IAIT; 403 delete IAIT;
422 delete IARI; 404 delete IARI;
423 delete IARDW; 405 delete IARDW;
424 delete IARDH; 406 delete IARDH;
425 delete IARDX; 407 delete IARDX;
426 delete IARDY; 408 delete IARDY;
427 delete IAID; 409 delete IAID;
428 } 410 }
429 return nullptr; 411 return nullptr;
430 } 412 }
OLDNEW
« no previous file with comments | « core/src/fxcodec/jbig2/JBig2_SddProc.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698