| Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| index 653ce2888ee6e1362570fab2ec0d1433f7a8733a..5cc117798cb177b5915a483a677bfcbdead9b0bb 100644
|
| --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| @@ -125,7 +125,9 @@ FX_FILESIZE CPDF_Parser::GetObjectPositionOrZero(FX_DWORD objnum) const {
|
| }
|
|
|
| uint8_t CPDF_Parser::GetObjectType(FX_DWORD objnum) const {
|
| - return m_V5Type[objnum];
|
| + ASSERT(IsValidObjectNumber(objnum));
|
| + auto it = m_ObjectInfo.find(objnum);
|
| + return it != m_ObjectInfo.end() ? it->second.type : 0;
|
| }
|
|
|
| uint16_t CPDF_Parser::GetObjectGenNum(FX_DWORD objnum) const {
|
| @@ -177,7 +179,6 @@ void CPDF_Parser::CloseParser() {
|
|
|
| m_SortedOffset.RemoveAll();
|
| m_ObjectInfo.clear();
|
| - m_V5Type.RemoveAll();
|
| m_ObjVersion.RemoveAll();
|
| int32_t iLen = m_Trailers.GetSize();
|
| for (int32_t i = 0; i < iLen; ++i) {
|
| @@ -341,10 +342,10 @@ FX_FILESIZE CPDF_Parser::GetObjectOffset(FX_DWORD objnum) const {
|
| if (!IsValidObjectNumber(objnum))
|
| return 0;
|
|
|
| - if (m_V5Type[objnum] == 1)
|
| + if (GetObjectType(objnum) == 1)
|
| return GetObjectPositionOrZero(objnum);
|
|
|
| - if (m_V5Type[objnum] == 2) {
|
| + if (GetObjectType(objnum) == 2) {
|
| FX_FILESIZE pos = GetObjectPositionOrZero(objnum);
|
| return GetObjectPositionOrZero(pos);
|
| }
|
| @@ -361,10 +362,8 @@ FX_BOOL CPDF_Parser::LoadAllCrossRefV4(FX_FILESIZE xrefpos) {
|
| }
|
|
|
| int32_t xrefsize = GetDirectInteger(m_pTrailer, "Size");
|
| - if (xrefsize > 0 && xrefsize <= kMaxXRefSize) {
|
| + if (xrefsize > 0 && xrefsize <= kMaxXRefSize)
|
| ShrinkObjectMap(xrefsize);
|
| - m_V5Type.SetSize(xrefsize);
|
| - }
|
|
|
| CFX_FileSizeArray CrossRefList;
|
| CFX_FileSizeArray XRefStreamList;
|
| @@ -473,7 +472,7 @@ FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos,
|
| char* pEntry = &buf[i * recordsize];
|
| if (pEntry[17] == 'f') {
|
| m_ObjectInfo[objnum].pos = 0;
|
| - m_V5Type.SetAtGrow(objnum, 0);
|
| + m_ObjectInfo[objnum].type = 0;
|
| } else {
|
| int32_t offset = FXSYS_atoi(pEntry);
|
| if (offset == 0) {
|
| @@ -496,7 +495,7 @@ FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos,
|
| m_SortedOffset.Add(m_ObjectInfo[objnum].pos);
|
| }
|
| }
|
| - m_V5Type.SetAtGrow(objnum, 1);
|
| + m_ObjectInfo[objnum].type = 1;
|
| }
|
| }
|
| }
|
| @@ -555,7 +554,7 @@ bool CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos,
|
| char* pEntry = &buf[i * recordsize];
|
| if (pEntry[17] == 'f') {
|
| m_ObjectInfo[objnum].pos = 0;
|
| - m_V5Type.SetAtGrow(objnum, 0);
|
| + m_ObjectInfo[objnum].type = 0;
|
| } else {
|
| FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry);
|
| if (offset == 0) {
|
| @@ -574,7 +573,7 @@ bool CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos,
|
| !FindPosInOffsets(m_ObjectInfo[objnum].pos)) {
|
| m_SortedOffset.Add(m_ObjectInfo[objnum].pos);
|
| }
|
| - m_V5Type.SetAtGrow(objnum, 1);
|
| + m_ObjectInfo[objnum].type = 1;
|
| }
|
| }
|
| }
|
| @@ -606,7 +605,6 @@ FX_BOOL CPDF_Parser::LoadAllCrossRefV5(FX_FILESIZE xrefpos) {
|
|
|
| FX_BOOL CPDF_Parser::RebuildCrossRef() {
|
| m_ObjectInfo.clear();
|
| - m_V5Type.RemoveAll();
|
| m_SortedOffset.RemoveAll();
|
| m_ObjVersion.RemoveAll();
|
| if (m_pTrailer) {
|
| @@ -822,7 +820,7 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() {
|
| }
|
| } else {
|
| m_ObjectInfo[objnum].pos = obj_pos;
|
| - m_V5Type.SetAtGrow(objnum, 1);
|
| + m_ObjectInfo[objnum].type = 1;
|
| m_ObjVersion.SetAtGrow(objnum, (int16_t)gennum);
|
| }
|
| if (pObject) {
|
| @@ -1016,9 +1014,8 @@ FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE* pos, FX_BOOL bMainXRef) {
|
| if (bMainXRef) {
|
| m_pTrailer = ToDictionary(pStream->GetDict()->Clone());
|
| ShrinkObjectMap(size);
|
| - if (m_V5Type.SetSize(size)) {
|
| - FXSYS_memset(m_V5Type.GetData(), 0, size);
|
| - }
|
| + for (auto it : m_ObjectInfo)
|
| + it.second.type = 0;
|
| } else {
|
| m_Trailers.Add(ToDictionary(pStream->GetDict()->Clone()));
|
| }
|
| @@ -1081,8 +1078,7 @@ FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE* pos, FX_BOOL bMainXRef) {
|
| const uint8_t* segstart = pData + segindex * totalWidth;
|
| FX_SAFE_DWORD dwMaxObjNum = startnum;
|
| dwMaxObjNum += count;
|
| - FX_DWORD dwV5Size =
|
| - pdfium::base::checked_cast<FX_DWORD, int32_t>(m_V5Type.GetSize());
|
| + FX_DWORD dwV5Size = m_ObjectInfo.empty() ? 0 : GetLastObjNum() + 1;
|
| if (!dwMaxObjNum.IsValid() || dwMaxObjNum.ValueOrDie() > dwV5Size) {
|
| continue;
|
| }
|
| @@ -1092,7 +1088,7 @@ FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE* pos, FX_BOOL bMainXRef) {
|
| if (WidthArray[0]) {
|
| type = GetVarInt(entrystart, WidthArray[0]);
|
| }
|
| - if (m_V5Type[startnum + j] == 255) {
|
| + if (GetObjectType(startnum + j) == 255) {
|
| FX_FILESIZE offset =
|
| GetVarInt(entrystart + WidthArray[0], WidthArray[1]);
|
| m_ObjectInfo[startnum + j].pos = offset;
|
| @@ -1104,10 +1100,10 @@ FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE* pos, FX_BOOL bMainXRef) {
|
| }
|
| continue;
|
| }
|
| - if (m_V5Type[startnum + j]) {
|
| + if (GetObjectType(startnum + j)) {
|
| continue;
|
| }
|
| - m_V5Type[startnum + j] = type;
|
| + m_ObjectInfo[startnum + j].type = type;
|
| if (type == 0) {
|
| m_ObjectInfo[startnum + j].pos = 0;
|
| } else {
|
| @@ -1122,11 +1118,11 @@ FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE* pos, FX_BOOL bMainXRef) {
|
| m_SortedOffset.Add(offset);
|
| }
|
| } else {
|
| - if (offset < 0 || offset >= m_V5Type.GetSize()) {
|
| + if (offset < 0 || !IsValidObjectNumber(offset)) {
|
| pStream->Release();
|
| return FALSE;
|
| }
|
| - m_V5Type[offset] = 255;
|
| + m_ObjectInfo[offset].type = 255;
|
| }
|
| }
|
| }
|
| @@ -1160,9 +1156,9 @@ FX_BOOL CPDF_Parser::IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) {
|
| bForm = FALSE;
|
| if (!IsValidObjectNumber(objnum))
|
| return TRUE;
|
| - if (m_V5Type[objnum] == 0)
|
| + if (GetObjectType(objnum) == 0)
|
| return TRUE;
|
| - if (m_V5Type[objnum] == 2)
|
| + if (GetObjectType(objnum) == 2)
|
| return TRUE;
|
| FX_FILESIZE pos = m_ObjectInfo[objnum].pos;
|
| void* pResult =
|
| @@ -1196,13 +1192,13 @@ CPDF_Object* CPDF_Parser::ParseIndirectObject(
|
| return nullptr;
|
| ScopedSetInsertion<FX_DWORD> local_insert(&m_ParsingObjNums, objnum);
|
|
|
| - if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) {
|
| + if (GetObjectType(objnum) == 1 || GetObjectType(objnum) == 255) {
|
| FX_FILESIZE pos = m_ObjectInfo[objnum].pos;
|
| if (pos <= 0)
|
| return nullptr;
|
| return ParseIndirectObjectAt(pObjList, pos, objnum);
|
| }
|
| - if (m_V5Type[objnum] != 2)
|
| + if (GetObjectType(objnum) != 2)
|
| return nullptr;
|
|
|
| CPDF_StreamAcc* pObjStream = GetObjectStream(m_ObjectInfo[objnum].pos);
|
| @@ -1254,10 +1250,10 @@ FX_FILESIZE CPDF_Parser::GetObjectSize(FX_DWORD objnum) const {
|
| if (!IsValidObjectNumber(objnum))
|
| return 0;
|
|
|
| - if (m_V5Type[objnum] == 2)
|
| + if (GetObjectType(objnum) == 2)
|
| objnum = GetObjectPositionOrZero(objnum);
|
|
|
| - if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) {
|
| + if (GetObjectType(objnum) == 1 || GetObjectType(objnum) == 255) {
|
| FX_FILESIZE offset = GetObjectPositionOrZero(objnum);
|
| if (offset == 0)
|
| return 0;
|
| @@ -1284,7 +1280,7 @@ void CPDF_Parser::GetIndirectBinary(FX_DWORD objnum,
|
| if (!IsValidObjectNumber(objnum))
|
| return;
|
|
|
| - if (m_V5Type[objnum] == 2) {
|
| + if (GetObjectType(objnum) == 2) {
|
| CPDF_StreamAcc* pObjStream = GetObjectStream(m_ObjectInfo[objnum].pos);
|
| if (!pObjStream)
|
| return;
|
| @@ -1316,7 +1312,7 @@ void CPDF_Parser::GetIndirectBinary(FX_DWORD objnum,
|
| return;
|
| }
|
|
|
| - if (m_V5Type[objnum] != 1)
|
| + if (GetObjectType(objnum) != 1)
|
| return;
|
|
|
| FX_FILESIZE pos = m_ObjectInfo[objnum].pos;
|
| @@ -1573,10 +1569,8 @@ CPDF_Parser::Error CPDF_Parser::StartAsyncParse(IFX_FileRead* pFileAccess) {
|
| }
|
|
|
| int32_t xrefsize = GetDirectInteger(m_pTrailer, "Size");
|
| - if (xrefsize > 0) {
|
| + if (xrefsize > 0)
|
| ShrinkObjectMap(xrefsize);
|
| - m_V5Type.SetSize(xrefsize);
|
| - }
|
| }
|
| Error eRet = SetEncryptHandler();
|
| if (eRet != SUCCESS) {
|
|
|