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 2a271f11793d869e94e8b21166f71f1070ba7a41..14c7a41ffe82213003141d036c3f48a00a2079e6 100644 |
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
@@ -6,6 +6,7 @@ |
#include "parser_int.h" |
+#include <algorithm> |
#include <set> |
#include <utility> |
#include <vector> |
@@ -615,21 +616,20 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
} |
int32_t status = 0; |
int32_t inside_index = 0; |
- FX_DWORD objnum = 0, gennum = 0; |
+ FX_DWORD objnum = 0; |
+ FX_DWORD gennum = 0; |
int32_t depth = 0; |
- uint8_t* buffer = FX_Alloc(uint8_t, 4096); |
+ const FX_DWORD kBufferSize = 4096; |
+ std::vector<uint8_t> buffer(kBufferSize); |
FX_FILESIZE pos = m_Syntax.m_HeaderOffset; |
FX_FILESIZE start_pos = 0, start_pos1 = 0; |
FX_FILESIZE last_obj = -1, last_xref = -1, last_trailer = -1; |
while (pos < m_Syntax.m_FileLen) { |
- FX_BOOL bOverFlow = FALSE; |
- FX_DWORD size = (FX_DWORD)(m_Syntax.m_FileLen - pos); |
- if (size > 4096) { |
- size = 4096; |
- } |
- if (!m_Syntax.m_pFileAccess->ReadBlock(buffer, pos, size)) { |
+ bool bOverFlow = false; |
+ FX_DWORD size = std::min((FX_DWORD)(m_Syntax.m_FileLen - pos), kBufferSize); |
+ if (!m_Syntax.m_pFileAccess->ReadBlock(buffer.data(), pos, size)) |
break; |
- } |
+ |
for (FX_DWORD i = 0; i < size; i++) { |
uint8_t byte = buffer[i]; |
switch (status) { |
@@ -803,7 +803,7 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
FX_FILESIZE nLen = obj_end - obj_pos - offset; |
if ((FX_DWORD)nLen > size - i) { |
pos = obj_end + m_Syntax.m_HeaderOffset; |
- bOverFlow = TRUE; |
+ bOverFlow = true; |
} else { |
i += (FX_DWORD)nLen; |
} |
@@ -960,6 +960,9 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
break; |
} |
} |
+ if (size == 0) |
+ break; |
Wei Li
2015/12/30 20:32:39
I think bOverFlow means overflow to the next buffe
Lei Zhang
2016/01/05 06:08:39
Right. This patch set causes test failures. See pa
|
+ |
pos += size; |
} |
if (last_xref != -1 && last_xref > last_obj) { |
@@ -974,7 +977,6 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
if (!pResult) { |
m_SortedOffset.Add(offset); |
} |
- FX_Free(buffer); |
return m_pTrailer && !m_ObjectInfo.empty(); |
} |