Chromium Code Reviews| Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp |
| diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp |
| index 39139c40ee12a0f042a40a68c0997755dd356b59..eb378833468682107512c17cdfd689ca8ca23d1d 100644 |
| --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp |
| +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp |
| @@ -49,35 +49,32 @@ FX_DWORD A85Decode(const uint8_t* src_buf, |
| uint8_t*& dest_buf, |
| FX_DWORD& dest_size) { |
| dest_size = 0; |
| - dest_buf = NULL; |
| - if (src_size == 0) { |
| + dest_buf = nullptr; |
| + if (src_size == 0) |
| return 0; |
| - } |
| + |
| + // Count legal characters and zeros. |
| FX_DWORD zcount = 0; |
| FX_DWORD pos = 0; |
| while (pos < src_size) { |
| uint8_t ch = src_buf[pos]; |
| - if (ch < '!' && ch != '\n' && ch != '\r' && ch != ' ' && ch != '\t') { |
| - break; |
| - } |
| if (ch == 'z') { |
| zcount++; |
| - } else if (ch > 'u') { |
| + } else if ((ch < '!' || ch > 'u') && !PDFCharIsLineEnding(ch) && |
| + ch != ' ' && ch != '\t') { |
| break; |
| } |
| pos++; |
| } |
| - if (pos == 0) { |
| + // No content to decode. |
| + if (pos == 0) |
| return 0; |
| - } |
| - if (zcount > UINT_MAX / 4) { |
|
Lei Zhang
2016/02/05 01:25:33
Why remove this?
Wei Li
2016/02/06 00:11:44
This one is redundant as the next statement should
Lei Zhang
2016/02/06 00:17:04
Sorry, it's not. If |zcount| is very large, zcount
Wei Li
2016/02/06 01:16:26
In that case, this should fix it.
|
| - return (FX_DWORD)-1; |
| - } |
| + |
| if (zcount * 4 > UINT_MAX - (pos - zcount)) { |
| return (FX_DWORD)-1; |
| } |
| dest_buf = FX_Alloc(uint8_t, zcount * 4 + (pos - zcount)); |
| - int state = 0; |
| + size_t state = 0; |
| uint32_t res = 0; |
| pos = dest_size = 0; |
| while (pos < src_size) { |
| @@ -90,46 +87,48 @@ FX_DWORD A85Decode(const uint8_t* src_buf, |
| state = 0; |
| res = 0; |
| dest_size += 4; |
| - } else { |
| - if (ch < '!' || ch > 'u') { |
| - break; |
| - } |
| + } else if (ch >= '!' && ch <= 'u') { |
| res = res * 85 + ch - 33; |
| state++; |
| if (state == 5) { |
| - for (int i = 0; i < 4; i++) { |
| + for (size_t i = 0; i < 4; i++) { |
| dest_buf[dest_size++] = (uint8_t)(res >> (3 - i) * 8); |
| } |
| state = 0; |
| res = 0; |
| } |
| + } else { |
| + // The end or illegal character. |
| + break; |
| } |
| } |
| + // Handle partial group. |
| if (state) { |
| - int i; |
| - for (i = state; i < 5; i++) { |
| + for (size_t i = state; i < 5; i++) |
| res = res * 85 + 84; |
| - } |
| - for (i = 0; i < state - 1; i++) { |
| + for (size_t i = 0; i < state - 1; i++) |
| dest_buf[dest_size++] = (uint8_t)(res >> (3 - i) * 8); |
| - } |
| } |
| - if (pos < src_size && src_buf[pos] == '>') { |
| + if (pos < src_size && src_buf[pos] == '>') |
| pos++; |
| - } |
| return pos; |
| } |
| + |
| FX_DWORD HexDecode(const uint8_t* src_buf, |
| FX_DWORD src_size, |
| uint8_t*& dest_buf, |
| FX_DWORD& dest_size) { |
| - FX_DWORD i; |
| - for (i = 0; i < src_size; i++) |
| - if (src_buf[i] == '>') { |
| - break; |
| - } |
| - dest_buf = FX_Alloc(uint8_t, i / 2 + 1); |
| dest_size = 0; |
| + dest_buf = nullptr; |
|
Lei Zhang
2016/02/05 01:25:33
Move this line into the 0 src_size handler?
Wei Li
2016/02/06 00:11:44
Done.
|
| + if (src_size == 0) |
| + return 0; |
| + |
| + FX_DWORD i = 0; |
| + // Find the end of data. |
| + while (i < src_size && src_buf[i++] != '>') { |
|
Lei Zhang
2016/02/05 01:25:33
Is |i| going to be incremented by 1 more in the ne
Wei Li
2016/02/06 00:11:44
Done.
|
| + } |
| + |
| + dest_buf = FX_Alloc(uint8_t, i / 2 + 1); |
| bool bFirst = true; |
| for (i = 0; i < src_size; i++) { |
| uint8_t ch = src_buf[i]; |
| @@ -218,6 +217,7 @@ FX_DWORD RunLengthDecode(const uint8_t* src_buf, |
| } |
| return ret; |
| } |
| + |
| ICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder( |
| const uint8_t* src_buf, |
| FX_DWORD src_size, |
| @@ -241,13 +241,14 @@ ICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder( |
| Rows = 0; |
| } |
| if (Columns <= 0 || Rows < 0 || Columns > USHRT_MAX || Rows > USHRT_MAX) { |
| - return NULL; |
| + return nullptr; |
| } |
| } |
| return CPDF_ModuleMgr::Get()->GetFaxModule()->CreateDecoder( |
| src_buf, src_size, width, height, K, EndOfLine, ByteAlign, BlackIs1, |
| Columns, Rows); |
| } |
| + |
| static FX_BOOL CheckFlateDecodeParams(int Colors, |
| int BitsPerComponent, |
| int Columns) { |
| @@ -269,6 +270,7 @@ static FX_BOOL CheckFlateDecodeParams(int Colors, |
| } |
| return TRUE; |
| } |
| + |
| ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder( |
| const uint8_t* src_buf, |
| FX_DWORD src_size, |
| @@ -285,13 +287,14 @@ ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder( |
| BitsPerComponent = pParams->GetIntegerBy("BitsPerComponent", 8); |
| Columns = pParams->GetIntegerBy("Columns", 1); |
| if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns)) { |
| - return NULL; |
| + return nullptr; |
| } |
| } |
| return CPDF_ModuleMgr::Get()->GetFlateModule()->CreateDecoder( |
| src_buf, src_size, width, height, nComps, bpc, predictor, Colors, |
| BitsPerComponent, Columns); |
| } |
| + |
| FX_DWORD FPDFAPI_FlateOrLZWDecode(FX_BOOL bLZW, |
| const uint8_t* src_buf, |
| FX_DWORD src_size, |
| @@ -316,6 +319,7 @@ FX_DWORD FPDFAPI_FlateOrLZWDecode(FX_BOOL bLZW, |
| bLZW, src_buf, src_size, bEarlyChange, predictor, Colors, |
| BitsPerComponent, Columns, estimated_size, dest_buf, dest_size); |
| } |
| + |
| FX_BOOL PDF_DataDecode(const uint8_t* src_buf, |
| FX_DWORD src_size, |
| const CPDF_Dictionary* pDict, |
| @@ -353,7 +357,7 @@ FX_BOOL PDF_DataDecode(const uint8_t* src_buf, |
| int estimated_size = |
| i == DecoderList.GetSize() - 1 ? last_estimated_size : 0; |
| CFX_ByteString decoder = DecoderList[i]; |
| - // Use ToDictionary here because we can push NULL into the ParamList. |
| + // Use ToDictionary here because we can push nullptr into the ParamList. |
| CPDF_Dictionary* pParam = ToDictionary(ParamList[i]); |
| uint8_t* new_buf = nullptr; |
| FX_DWORD new_size = (FX_DWORD)-1; |
| @@ -417,6 +421,7 @@ FX_BOOL PDF_DataDecode(const uint8_t* src_buf, |
| dest_size = last_size; |
| return TRUE; |
| } |
| + |
| CFX_WideString PDF_DecodeText(const uint8_t* src_data, |
| FX_DWORD src_len, |
| CFX_CharMap* pCharMap) { |
| @@ -464,6 +469,7 @@ CFX_WideString PDF_DecodeText(const uint8_t* src_data, |
| } |
| return result; |
| } |
| + |
| CFX_ByteString PDF_EncodeText(const FX_WCHAR* pString, |
| int len, |
| CFX_CharMap* pCharMap) { |
| @@ -509,6 +515,7 @@ CFX_ByteString PDF_EncodeText(const FX_WCHAR* pString, |
| result.ReleaseBuffer(encLen); |
| return result; |
| } |
| + |
| CFX_ByteString PDF_EncodeString(const CFX_ByteString& src, FX_BOOL bHex) { |
| CFX_ByteTextBuf result; |
| int srclen = src.GetLength(); |
| @@ -538,6 +545,7 @@ CFX_ByteString PDF_EncodeString(const CFX_ByteString& src, FX_BOOL bHex) { |
| result.AppendChar(')'); |
| return result.GetByteString(); |
| } |
| + |
| void FlateEncode(const uint8_t* src_buf, |
| FX_DWORD src_size, |
| uint8_t*& dest_buf, |
| @@ -547,6 +555,7 @@ void FlateEncode(const uint8_t* src_buf, |
| pEncoders->GetFlateModule()->Encode(src_buf, src_size, dest_buf, dest_size); |
| } |
| } |
| + |
| void FlateEncode(const uint8_t* src_buf, |
| FX_DWORD src_size, |
| int predictor, |
| @@ -562,6 +571,7 @@ void FlateEncode(const uint8_t* src_buf, |
| dest_size); |
| } |
| } |
| + |
| FX_DWORD FlateDecode(const uint8_t* src_buf, |
| FX_DWORD src_size, |
| uint8_t*& dest_buf, |