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

Side by Side Diff: core/fxcodec/jbig2/JBig2_Context.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: 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
« no previous file with comments | « no previous file | core/fxcodec/jbig2/JBig2_GrdProc.cpp » ('j') | core/fxcodec/jbig2/JBig2_Image.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 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_Context.h" 7 #include "core/fxcodec/jbig2/JBig2_Context.h"
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <list> 10 #include <list>
(...skipping 906 matching lines...) Expand 10 before | Expand all | Expand 10 after
917 pSegment->m_Result.im = 917 pSegment->m_Result.im =
918 pTRD->decode_Huffman(m_pStream.get(), grContext.get()); 918 pTRD->decode_Huffman(m_pStream.get(), grContext.get());
919 if (!pSegment->m_Result.im) 919 if (!pSegment->m_Result.im)
920 return JBIG2_ERROR_FATAL; 920 return JBIG2_ERROR_FATAL;
921 m_pStream->alignByte(); 921 m_pStream->alignByte();
922 } 922 }
923 if (pSegment->m_cFlags.s.type != 4) { 923 if (pSegment->m_cFlags.s.type != 4) {
924 if (!m_bBufSpecified) { 924 if (!m_bBufSpecified) {
925 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); 925 JBig2PageInfo* pPageInfo = m_PageInfoList.back();
926 if ((pPageInfo->m_bIsStriped == 1) && 926 if ((pPageInfo->m_bIsStriped == 1) &&
927 (ri.y + ri.height > m_pPage->m_nHeight)) { 927 (ri.y + ri.height > m_pPage->height())) {
928 m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); 928 m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);
929 } 929 }
930 } 930 }
931 m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, 931 m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im,
932 (JBig2ComposeOp)(ri.flags & 0x03)); 932 (JBig2ComposeOp)(ri.flags & 0x03));
933 delete pSegment->m_Result.im; 933 delete pSegment->m_Result.im;
934 pSegment->m_Result.im = nullptr; 934 pSegment->m_Result.im = nullptr;
935 } 935 }
936 return JBIG2_SUCCESS; 936 return JBIG2_SUCCESS;
937 } 937 }
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1008 findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]); 1008 findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]);
1009 if (!pSeg || (pSeg->m_cFlags.s.type != 16)) 1009 if (!pSeg || (pSeg->m_cFlags.s.type != 16))
1010 return JBIG2_ERROR_FATAL; 1010 return JBIG2_ERROR_FATAL;
1011 1011
1012 CJBig2_PatternDict* pPatternDict = pSeg->m_Result.pd; 1012 CJBig2_PatternDict* pPatternDict = pSeg->m_Result.pd;
1013 if (!pPatternDict || (pPatternDict->NUMPATS == 0)) 1013 if (!pPatternDict || (pPatternDict->NUMPATS == 0))
1014 return JBIG2_ERROR_FATAL; 1014 return JBIG2_ERROR_FATAL;
1015 1015
1016 pHRD->HNUMPATS = pPatternDict->NUMPATS; 1016 pHRD->HNUMPATS = pPatternDict->NUMPATS;
1017 pHRD->HPATS = pPatternDict->HDPATS; 1017 pHRD->HPATS = pPatternDict->HDPATS;
1018 pHRD->HPW = pPatternDict->HDPATS[0]->m_nWidth; 1018 pHRD->HPW = pPatternDict->HDPATS[0]->width();
1019 pHRD->HPH = pPatternDict->HDPATS[0]->m_nHeight; 1019 pHRD->HPH = pPatternDict->HDPATS[0]->height();
1020 pSegment->m_nResultType = JBIG2_IMAGE_POINTER; 1020 pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
1021 if (pHRD->HMMR == 0) { 1021 if (pHRD->HMMR == 0) {
1022 const size_t size = GetHuffContextSize(pHRD->HTEMPLATE); 1022 const size_t size = GetHuffContextSize(pHRD->HTEMPLATE);
1023 std::unique_ptr<JBig2ArithCtx, FxFreeDeleter> gbContext( 1023 std::unique_ptr<JBig2ArithCtx, FxFreeDeleter> gbContext(
1024 FX_Alloc(JBig2ArithCtx, size)); 1024 FX_Alloc(JBig2ArithCtx, size));
1025 JBIG2_memset(gbContext.get(), 0, sizeof(JBig2ArithCtx) * size); 1025 JBIG2_memset(gbContext.get(), 0, sizeof(JBig2ArithCtx) * size);
1026 std::unique_ptr<CJBig2_ArithDecoder> pArithDecoder( 1026 std::unique_ptr<CJBig2_ArithDecoder> pArithDecoder(
1027 new CJBig2_ArithDecoder(m_pStream.get())); 1027 new CJBig2_ArithDecoder(m_pStream.get()));
1028 pSegment->m_Result.im = 1028 pSegment->m_Result.im =
1029 pHRD->decode_Arith(pArithDecoder.get(), gbContext.get(), pPause); 1029 pHRD->decode_Arith(pArithDecoder.get(), gbContext.get(), pPause);
1030 if (!pSegment->m_Result.im) 1030 if (!pSegment->m_Result.im)
1031 return JBIG2_ERROR_FATAL; 1031 return JBIG2_ERROR_FATAL;
1032 1032
1033 m_pStream->alignByte(); 1033 m_pStream->alignByte();
1034 m_pStream->offset(2); 1034 m_pStream->offset(2);
1035 } else { 1035 } else {
1036 pSegment->m_Result.im = pHRD->decode_MMR(m_pStream.get(), pPause); 1036 pSegment->m_Result.im = pHRD->decode_MMR(m_pStream.get(), pPause);
1037 if (!pSegment->m_Result.im) 1037 if (!pSegment->m_Result.im)
1038 return JBIG2_ERROR_FATAL; 1038 return JBIG2_ERROR_FATAL;
1039 m_pStream->alignByte(); 1039 m_pStream->alignByte();
1040 } 1040 }
1041 if (pSegment->m_cFlags.s.type != 20) { 1041 if (pSegment->m_cFlags.s.type != 20) {
1042 if (!m_bBufSpecified) { 1042 if (!m_bBufSpecified) {
1043 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); 1043 JBig2PageInfo* pPageInfo = m_PageInfoList.back();
1044 if (pPageInfo->m_bIsStriped == 1 && 1044 if (pPageInfo->m_bIsStriped == 1 &&
1045 ri.y + ri.height > m_pPage->m_nHeight) { 1045 ri.y + ri.height > m_pPage->height()) {
1046 m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); 1046 m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);
1047 } 1047 }
1048 } 1048 }
1049 m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, 1049 m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im,
1050 (JBig2ComposeOp)(ri.flags & 0x03)); 1050 (JBig2ComposeOp)(ri.flags & 0x03));
1051 delete pSegment->m_Result.im; 1051 delete pSegment->m_Result.im;
1052 pSegment->m_Result.im = nullptr; 1052 pSegment->m_Result.im = nullptr;
1053 } 1053 }
1054 return JBIG2_SUCCESS; 1054 return JBIG2_SUCCESS;
1055 } 1055 }
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1101 m_pArithDecoder.get(), 1101 m_pArithDecoder.get(),
1102 &m_gbContext[0], pPause); 1102 &m_gbContext[0], pPause);
1103 } else { 1103 } else {
1104 m_ProcessingStatus = m_pGRD->Continue_decode(pPause); 1104 m_ProcessingStatus = m_pGRD->Continue_decode(pPause);
1105 } 1105 }
1106 if (m_ProcessingStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { 1106 if (m_ProcessingStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
1107 if (pSegment->m_cFlags.s.type != 36) { 1107 if (pSegment->m_cFlags.s.type != 36) {
1108 if (!m_bBufSpecified) { 1108 if (!m_bBufSpecified) {
1109 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); 1109 JBig2PageInfo* pPageInfo = m_PageInfoList.back();
1110 if ((pPageInfo->m_bIsStriped == 1) && 1110 if ((pPageInfo->m_bIsStriped == 1) &&
1111 (m_ri.y + m_ri.height > m_pPage->m_nHeight)) { 1111 (m_ri.y + m_ri.height > m_pPage->height())) {
1112 m_pPage->expand(m_ri.y + m_ri.height, 1112 m_pPage->expand(m_ri.y + m_ri.height,
1113 (pPageInfo->m_cFlags & 4) ? 1 : 0); 1113 (pPageInfo->m_cFlags & 4) ? 1 : 0);
1114 } 1114 }
1115 } 1115 }
1116 FX_RECT Rect = m_pGRD->GetReplaceRect(); 1116 FX_RECT Rect = m_pGRD->GetReplaceRect();
1117 m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, 1117 m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top,
1118 pSegment->m_Result.im, 1118 pSegment->m_Result.im,
1119 (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect); 1119 (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect);
1120 } 1120 }
1121 return JBIG2_SUCCESS; 1121 return JBIG2_SUCCESS;
(...skipping 13 matching lines...) Expand all
1135 if (!pSegment->m_Result.im) { 1135 if (!pSegment->m_Result.im) {
1136 m_pGRD.reset(); 1136 m_pGRD.reset();
1137 return JBIG2_ERROR_FATAL; 1137 return JBIG2_ERROR_FATAL;
1138 } 1138 }
1139 m_pStream->alignByte(); 1139 m_pStream->alignByte();
1140 } 1140 }
1141 if (pSegment->m_cFlags.s.type != 36) { 1141 if (pSegment->m_cFlags.s.type != 36) {
1142 if (!m_bBufSpecified) { 1142 if (!m_bBufSpecified) {
1143 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); 1143 JBig2PageInfo* pPageInfo = m_PageInfoList.back();
1144 if ((pPageInfo->m_bIsStriped == 1) && 1144 if ((pPageInfo->m_bIsStriped == 1) &&
1145 (m_ri.y + m_ri.height > m_pPage->m_nHeight)) { 1145 (m_ri.y + m_ri.height > m_pPage->height())) {
1146 m_pPage->expand(m_ri.y + m_ri.height, 1146 m_pPage->expand(m_ri.y + m_ri.height,
1147 (pPageInfo->m_cFlags & 4) ? 1 : 0); 1147 (pPageInfo->m_cFlags & 4) ? 1 : 0);
1148 } 1148 }
1149 } 1149 }
1150 FX_RECT Rect = m_pGRD->GetReplaceRect(); 1150 FX_RECT Rect = m_pGRD->GetReplaceRect();
1151 m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, 1151 m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top,
1152 pSegment->m_Result.im, 1152 pSegment->m_Result.im,
1153 (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect); 1153 (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect);
1154 delete pSegment->m_Result.im; 1154 delete pSegment->m_Result.im;
1155 pSegment->m_Result.im = nullptr; 1155 pSegment->m_Result.im = nullptr;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1208 pSegment->m_Result.im = pGRRD->decode(pArithDecoder.get(), grContext.get()); 1208 pSegment->m_Result.im = pGRRD->decode(pArithDecoder.get(), grContext.get());
1209 if (!pSegment->m_Result.im) 1209 if (!pSegment->m_Result.im)
1210 return JBIG2_ERROR_FATAL; 1210 return JBIG2_ERROR_FATAL;
1211 1211
1212 m_pStream->alignByte(); 1212 m_pStream->alignByte();
1213 m_pStream->offset(2); 1213 m_pStream->offset(2);
1214 if (pSegment->m_cFlags.s.type != 40) { 1214 if (pSegment->m_cFlags.s.type != 40) {
1215 if (!m_bBufSpecified) { 1215 if (!m_bBufSpecified) {
1216 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); 1216 JBig2PageInfo* pPageInfo = m_PageInfoList.back();
1217 if ((pPageInfo->m_bIsStriped == 1) && 1217 if ((pPageInfo->m_bIsStriped == 1) &&
1218 (ri.y + ri.height > m_pPage->m_nHeight)) { 1218 (ri.y + ri.height > m_pPage->height())) {
1219 m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); 1219 m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);
1220 } 1220 }
1221 } 1221 }
1222 m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, 1222 m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im,
1223 (JBig2ComposeOp)(ri.flags & 0x03)); 1223 (JBig2ComposeOp)(ri.flags & 0x03));
1224 delete pSegment->m_Result.im; 1224 delete pSegment->m_Result.im;
1225 pSegment->m_Result.im = nullptr; 1225 pSegment->m_Result.im = nullptr;
1226 } 1226 }
1227 return JBIG2_SUCCESS; 1227 return JBIG2_SUCCESS;
1228 } 1228 }
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1387 SBSYMCODES[CURTEMP].code = CURCODE; 1387 SBSYMCODES[CURTEMP].code = CURCODE;
1388 CURCODE = CURCODE + 1; 1388 CURCODE = CURCODE + 1;
1389 } 1389 }
1390 CURTEMP = CURTEMP + 1; 1390 CURTEMP = CURTEMP + 1;
1391 } 1391 }
1392 CURLEN = CURLEN + 1; 1392 CURLEN = CURLEN + 1;
1393 } 1393 }
1394 FX_Free(LENCOUNT); 1394 FX_Free(LENCOUNT);
1395 FX_Free(FIRSTCODE); 1395 FX_Free(FIRSTCODE);
1396 } 1396 }
OLDNEW
« no previous file with comments | « no previous file | core/fxcodec/jbig2/JBig2_GrdProc.cpp » ('j') | core/fxcodec/jbig2/JBig2_Image.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698