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

Side by Side Diff: core/fpdfapi/fpdf_parser/cpdf_hint_tables.cpp

Issue 2255083004: Add a fuzzer for CPDF_HintTables. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: Add a fuzzer for CPDF_HintTables. 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 | « core/fpdfapi/fpdf_parser/cpdf_hint_tables.h ('k') | testing/DEPS » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 PDFium Authors. All rights reserved. 1 // Copyright 2016 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/fpdfapi/fpdf_parser/cpdf_hint_tables.h" 7 #include "core/fpdfapi/fpdf_parser/cpdf_hint_tables.h"
8 8
9 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" 9 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
10 #include "core/fpdfapi/fpdf_parser/include/cpdf_data_avail.h" 10 #include "core/fpdfapi/fpdf_parser/include/cpdf_data_avail.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 int nStreamLen = ReadPrimaryHintStreamLength(); 53 int nStreamLen = ReadPrimaryHintStreamLength();
54 if (nStreamOffset < 0 || nStreamLen < 1) 54 if (nStreamOffset < 0 || nStreamLen < 1)
55 return false; 55 return false;
56 56
57 const uint32_t kHeaderSize = 288; 57 const uint32_t kHeaderSize = 288;
58 if (hStream->BitsRemaining() < kHeaderSize) 58 if (hStream->BitsRemaining() < kHeaderSize)
59 return false; 59 return false;
60 60
61 // Item 1: The least number of objects in a page. 61 // Item 1: The least number of objects in a page.
62 uint32_t dwObjLeastNum = hStream->GetBits(32); 62 uint32_t dwObjLeastNum = hStream->GetBits(32);
63 if (!dwObjLeastNum)
64 return FALSE;
63 65
64 // Item 2: The location of the first page's page object. 66 // Item 2: The location of the first page's page object.
65 uint32_t dwFirstObjLoc = hStream->GetBits(32); 67 uint32_t dwFirstObjLoc = hStream->GetBits(32);
66 if (dwFirstObjLoc > static_cast<uint32_t>(nStreamOffset)) { 68 if (dwFirstObjLoc > static_cast<uint32_t>(nStreamOffset)) {
67 FX_SAFE_UINT32 safeLoc = pdfium::base::checked_cast<uint32_t>(nStreamLen); 69 FX_SAFE_UINT32 safeLoc = pdfium::base::checked_cast<uint32_t>(nStreamLen);
68 safeLoc += dwFirstObjLoc; 70 safeLoc += dwFirstObjLoc;
69 if (!safeLoc.IsValid()) 71 if (!safeLoc.IsValid())
70 return false; 72 return false;
71 m_szFirstPageObjOffset = 73 m_szFirstPageObjOffset =
72 pdfium::base::checked_cast<FX_FILESIZE>(safeLoc.ValueOrDie()); 74 pdfium::base::checked_cast<FX_FILESIZE>(safeLoc.ValueOrDie());
73 } else { 75 } else {
74 m_szFirstPageObjOffset = 76 m_szFirstPageObjOffset =
75 pdfium::base::checked_cast<FX_FILESIZE>(dwFirstObjLoc); 77 pdfium::base::checked_cast<FX_FILESIZE>(dwFirstObjLoc);
76 } 78 }
77 79
78 // Item 3: The number of bits needed to represent the difference 80 // Item 3: The number of bits needed to represent the difference
79 // between the greatest and least number of objects in a page. 81 // between the greatest and least number of objects in a page.
80 uint32_t dwDeltaObjectsBits = hStream->GetBits(16); 82 uint32_t dwDeltaObjectsBits = hStream->GetBits(16);
83 if (!dwDeltaObjectsBits)
84 return FALSE;
81 85
82 // Item 4: The least length of a page in bytes. 86 // Item 4: The least length of a page in bytes.
83 uint32_t dwPageLeastLen = hStream->GetBits(32); 87 uint32_t dwPageLeastLen = hStream->GetBits(32);
88 if (!dwPageLeastLen)
89 return FALSE;
84 90
85 // Item 5: The number of bits needed to represent the difference 91 // Item 5: The number of bits needed to represent the difference
86 // between the greatest and least length of a page, in bytes. 92 // between the greatest and least length of a page, in bytes.
87 uint32_t dwDeltaPageLenBits = hStream->GetBits(16); 93 uint32_t dwDeltaPageLenBits = hStream->GetBits(16);
94 if (!dwDeltaPageLenBits)
95 return FALSE;
88 96
89 // Skip Item 6, 7, 8, 9 total 96 bits. 97 // Skip Item 6, 7, 8, 9 total 96 bits.
90 hStream->SkipBits(96); 98 hStream->SkipBits(96);
91 99
92 // Item 10: The number of bits needed to represent the greatest 100 // Item 10: The number of bits needed to represent the greatest
93 // number of shared object references. 101 // number of shared object references.
94 uint32_t dwSharedObjBits = hStream->GetBits(16); 102 uint32_t dwSharedObjBits = hStream->GetBits(16);
95 103
96 // Item 11: The number of bits needed to represent the numerically 104 // Item 11: The number of bits needed to represent the numerically
97 // greatest shared object identifier used by the pages. 105 // greatest shared object identifier used by the pages.
98 uint32_t dwSharedIdBits = hStream->GetBits(16); 106 uint32_t dwSharedIdBits = hStream->GetBits(16);
107 if (!dwSharedObjBits)
108 return FALSE;
99 109
100 // Item 12: The number of bits needed to represent the numerator of 110 // Item 12: The number of bits needed to represent the numerator of
101 // the fractional position for each shared object reference. For each 111 // the fractional position for each shared object reference. For each
102 // shared object referenced from a page, there is an indication of 112 // shared object referenced from a page, there is an indication of
103 // where in the page's content stream the object is first referenced. 113 // where in the page's content stream the object is first referenced.
104 uint32_t dwSharedNumeratorBits = hStream->GetBits(16); 114 uint32_t dwSharedNumeratorBits = hStream->GetBits(16);
115 if (!dwSharedIdBits)
116 return FALSE;
105 117
106 // Item 13: Skip Item 13 which has 16 bits. 118 // Item 13: Skip Item 13 which has 16 bits.
107 hStream->SkipBits(16); 119 hStream->SkipBits(16);
108 120
109 // The maximum number of bits allowed to represent the greatest number of 121 // The maximum number of bits allowed to represent the greatest number of
110 // shared object references. 2^39 should be more than enough. 122 // shared object references. 2^39 should be more than enough.
111 constexpr uint32_t kMaxSharedObjBits = 39; 123 constexpr uint32_t kMaxSharedObjBits = 39;
112 if (dwSharedObjBits > kMaxSharedObjBits) 124 if (dwSharedObjBits > kMaxSharedObjBits)
113 return false; 125 return false;
114 126
115 const int nPages = GetNumberOfPages(); 127 const int nPages = GetNumberOfPages();
116 if (nPages < 1) 128 if (nPages < 1 || nPages >= FPDF_PAGE_MAX_NUM)
117 return false; 129 return false;
118 130
119 const uint32_t dwPages = pdfium::base::checked_cast<uint32_t>(nPages); 131 const uint32_t dwPages = pdfium::base::checked_cast<uint32_t>(nPages);
120 FX_SAFE_UINT32 required_bits = dwDeltaObjectsBits; 132 FX_SAFE_UINT32 required_bits = dwDeltaObjectsBits;
121 required_bits *= dwPages; 133 required_bits *= dwPages;
122 if (!CanReadFromBitStream(hStream, required_bits)) 134 if (!CanReadFromBitStream(hStream, required_bits))
123 return false; 135 return false;
124 136
125 for (int i = 0; i < nPages; ++i) { 137 for (int i = 0; i < nPages; ++i) {
126 FX_SAFE_UINT32 safeDeltaObj = hStream->GetBits(dwDeltaObjectsBits); 138 FX_SAFE_UINT32 safeDeltaObj = hStream->GetBits(dwDeltaObjectsBits);
127 safeDeltaObj += dwObjLeastNum; 139 safeDeltaObj += dwObjLeastNum;
128 if (!safeDeltaObj.IsValid()) 140 if (!safeDeltaObj.IsValid())
129 return false; 141 return false;
130 m_dwDeltaNObjsArray.push_back(safeDeltaObj.ValueOrDie()); 142 m_dwDeltaNObjsArray.push_back(safeDeltaObj.ValueOrDie());
131 } 143 }
132 hStream->ByteAlign(); 144 hStream->ByteAlign();
133 145
134 required_bits = dwDeltaPageLenBits; 146 required_bits = dwDeltaPageLenBits;
135 required_bits *= dwPages; 147 required_bits *= dwPages;
136 if (!CanReadFromBitStream(hStream, required_bits)) 148 if (!CanReadFromBitStream(hStream, required_bits))
137 return false; 149 return false;
138 150
139 CFX_ArrayTemplate<uint32_t> dwPageLenArray; 151 std::vector<uint32_t> dwPageLenArray;
140 for (int i = 0; i < nPages; ++i) { 152 for (int i = 0; i < nPages; ++i) {
141 FX_SAFE_UINT32 safePageLen = hStream->GetBits(dwDeltaPageLenBits); 153 FX_SAFE_UINT32 safePageLen = hStream->GetBits(dwDeltaPageLenBits);
142 safePageLen += dwPageLeastLen; 154 safePageLen += dwPageLeastLen;
143 if (!safePageLen.IsValid()) 155 if (!safePageLen.IsValid())
144 return false; 156 return false;
145 dwPageLenArray.Add(safePageLen.ValueOrDie()); 157
158 dwPageLenArray.push_back(safePageLen.ValueOrDie());
146 } 159 }
147 160
148 int nOffsetE = GetEndOfFirstPageOffset(); 161 int nOffsetE = GetEndOfFirstPageOffset();
149 if (nOffsetE < 0) 162 if (nOffsetE < 0)
150 return false; 163 return false;
151 164
152 int nFirstPageNum = GetFirstPageNumber(); 165 int nFirstPageNum = GetFirstPageNumber();
153 for (int i = 0; i < nPages; ++i) { 166 for (int i = 0; i < nPages; ++i) {
154 if (i == nFirstPageNum) { 167 if (i == nFirstPageNum) {
155 m_szPageOffsetArray.push_back(m_szFirstPageObjOffset); 168 m_szPageOffsetArray.push_back(m_szFirstPageObjOffset);
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
476 } 489 }
477 490
478 int CPDF_HintTables::ReadPrimaryHintStream(int index) const { 491 int CPDF_HintTables::ReadPrimaryHintStream(int index) const {
479 CPDF_Array* pRange = m_pLinearizedDict->GetArrayBy("H"); 492 CPDF_Array* pRange = m_pLinearizedDict->GetArrayBy("H");
480 if (!pRange) 493 if (!pRange)
481 return -1; 494 return -1;
482 495
483 CPDF_Object* pStreamLen = pRange->GetDirectObjectAt(index); 496 CPDF_Object* pStreamLen = pRange->GetDirectObjectAt(index);
484 return pStreamLen ? pStreamLen->GetInteger() : -1; 497 return pStreamLen ? pStreamLen->GetInteger() : -1;
485 } 498 }
OLDNEW
« no previous file with comments | « core/fpdfapi/fpdf_parser/cpdf_hint_tables.h ('k') | testing/DEPS » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698