Index: core/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp |
diff --git a/core/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp b/core/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp |
index 1b5bd024f8ddb3684d89d1a1c29804b2495ceaee..3d8e706642615a19d0dfefa844eb51ce3ac00e6c 100644 |
--- a/core/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp |
+++ b/core/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp |
@@ -7,6 +7,8 @@ |
#include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h" |
#include <limits.h> |
+ |
+#include <algorithm> |
#include <utility> |
#include <vector> |
@@ -174,20 +176,21 @@ uint32_t RunLengthDecode(const uint8_t* src_buf, |
uint32_t old; |
dest_size = 0; |
while (i < src_size) { |
+ if (src_buf[i] == 128) |
+ break; |
+ |
if (src_buf[i] < 128) { |
old = dest_size; |
dest_size += src_buf[i] + 1; |
if (dest_size < old) |
Tom Sepez
2016/09/23 21:55:48
note: OK, unsigned type.
|
return FX_INVALID_OFFSET; |
i += src_buf[i] + 2; |
Tom Sepez
2016/09/23 21:55:48
note: there's one value where this can overflow, e
Lei Zhang
2016/09/26 22:50:59
Sure.
|
- } else if (src_buf[i] > 128) { |
+ } else { |
old = dest_size; |
dest_size += 257 - src_buf[i]; |
if (dest_size < old) |
return FX_INVALID_OFFSET; |
i += 2; |
- } else { |
- break; |
} |
} |
if (dest_size >= _STREAM_MAX_SIZE_) |
@@ -196,6 +199,9 @@ uint32_t RunLengthDecode(const uint8_t* src_buf, |
i = 0; |
int dest_count = 0; |
while (i < src_size) { |
+ if (src_buf[i] == 128) |
+ break; |
+ |
if (src_buf[i] < 128) { |
uint32_t copy_len = src_buf[i] + 1; |
uint32_t buf_left = src_size - i - 1; |
@@ -207,7 +213,7 @@ uint32_t RunLengthDecode(const uint8_t* src_buf, |
FXSYS_memcpy(dest_buf + dest_count, src_buf + i + 1, copy_len); |
dest_count += src_buf[i] + 1; |
i += src_buf[i] + 2; |
- } else if (src_buf[i] > 128) { |
+ } else { |
int fill = 0; |
if (i < src_size - 1) { |
fill = src_buf[i + 1]; |
@@ -215,15 +221,10 @@ uint32_t RunLengthDecode(const uint8_t* src_buf, |
FXSYS_memset(dest_buf + dest_count, fill, 257 - src_buf[i]); |
dest_count += 257 - src_buf[i]; |
i += 2; |
- } else { |
- break; |
} |
} |
- uint32_t ret = i + 1; |
- if (ret > src_size) { |
- ret = src_size; |
- } |
- return ret; |
+ |
+ return std::min(i + 1, src_size); |
} |
CCodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder( |
@@ -233,16 +234,16 @@ CCodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder( |
int height, |
const CPDF_Dictionary* pParams) { |
int K = 0; |
- FX_BOOL EndOfLine = FALSE; |
- FX_BOOL ByteAlign = FALSE; |
- FX_BOOL BlackIs1 = FALSE; |
+ bool EndOfLine = false; |
+ bool ByteAlign = false; |
+ bool BlackIs1 = false; |
int Columns = 1728; |
int Rows = 0; |
if (pParams) { |
K = pParams->GetIntegerFor("K"); |
- EndOfLine = pParams->GetIntegerFor("EndOfLine"); |
- ByteAlign = pParams->GetIntegerFor("EncodedByteAlign"); |
- BlackIs1 = pParams->GetIntegerFor("BlackIs1"); |
+ EndOfLine = !!pParams->GetIntegerFor("EndOfLine"); |
Tom Sepez
2016/09/23 21:55:48
Yay, another not assigning 0 or 1 to FX_BOOL !!!
Lei Zhang
2016/09/26 22:50:59
Acknowledged.
|
+ ByteAlign = !!pParams->GetIntegerFor("EncodedByteAlign"); |
+ BlackIs1 = !!pParams->GetIntegerFor("BlackIs1"); |
Columns = pParams->GetIntegerFor("Columns", 1728); |
Rows = pParams->GetIntegerFor("Rows"); |
if (Rows > USHRT_MAX) { |