| 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..eaf1e041930dd352c2db3bcf65211f38b7459a82 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>
|
|
|
| @@ -18,7 +20,26 @@
|
| #include "core/fxcrt/include/fx_ext.h"
|
| #include "third_party/base/stl_util.h"
|
|
|
| -#define _STREAM_MAX_SIZE_ 20 * 1024 * 1024
|
| +namespace {
|
| +
|
| +const uint32_t kMaxStreamSize = 20 * 1024 * 1024;
|
| +
|
| +bool CheckFlateDecodeParams(int Colors, int BitsPerComponent, int Columns) {
|
| + if (Colors < 0 || BitsPerComponent < 0 || Columns < 0)
|
| + return false;
|
| +
|
| + int check = Columns;
|
| + if (check > 0 && Colors > INT_MAX / check)
|
| + return false;
|
| +
|
| + check *= Colors;
|
| + if (check > 0 && BitsPerComponent > INT_MAX / check)
|
| + return false;
|
| +
|
| + return check * BitsPerComponent <= INT_MAX - 7;
|
| +}
|
| +
|
| +} // namespace
|
|
|
| const uint16_t PDFDocEncoding[256] = {
|
| 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008,
|
| @@ -171,31 +192,34 @@ uint32_t RunLengthDecode(const uint8_t* src_buf,
|
| uint8_t*& dest_buf,
|
| uint32_t& dest_size) {
|
| uint32_t i = 0;
|
| - uint32_t old;
|
| dest_size = 0;
|
| while (i < src_size) {
|
| + if (src_buf[i] == 128)
|
| + break;
|
| +
|
| + uint32_t old = dest_size;
|
| if (src_buf[i] < 128) {
|
| - old = dest_size;
|
| dest_size += src_buf[i] + 1;
|
| if (dest_size < old)
|
| return FX_INVALID_OFFSET;
|
| i += src_buf[i] + 2;
|
| - } else if (src_buf[i] > 128) {
|
| - old = dest_size;
|
| + } else {
|
| dest_size += 257 - src_buf[i];
|
| if (dest_size < old)
|
| return FX_INVALID_OFFSET;
|
| i += 2;
|
| - } else {
|
| - break;
|
| }
|
| }
|
| - if (dest_size >= _STREAM_MAX_SIZE_)
|
| + if (dest_size >= kMaxStreamSize)
|
| return FX_INVALID_OFFSET;
|
| +
|
| dest_buf = FX_Alloc(uint8_t, dest_size);
|
| 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 +231,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 +239,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 +252,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");
|
| + ByteAlign = !!pParams->GetIntegerFor("EncodedByteAlign");
|
| + BlackIs1 = !!pParams->GetIntegerFor("BlackIs1");
|
| Columns = pParams->GetIntegerFor("Columns", 1728);
|
| Rows = pParams->GetIntegerFor("Rows");
|
| if (Rows > USHRT_MAX) {
|
| @@ -254,28 +273,6 @@ CCodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(
|
| Columns, Rows);
|
| }
|
|
|
| -static FX_BOOL CheckFlateDecodeParams(int Colors,
|
| - int BitsPerComponent,
|
| - int Columns) {
|
| - if (Columns < 0) {
|
| - return FALSE;
|
| - }
|
| - int check = Columns;
|
| - if (Colors < 0 || (check > 0 && Colors > INT_MAX / check)) {
|
| - return FALSE;
|
| - }
|
| - check *= Colors;
|
| - if (BitsPerComponent < 0 ||
|
| - (check > 0 && BitsPerComponent > INT_MAX / check)) {
|
| - return FALSE;
|
| - }
|
| - check *= BitsPerComponent;
|
| - if (check > INT_MAX - 7) {
|
| - return FALSE;
|
| - }
|
| - return TRUE;
|
| -}
|
| -
|
| CCodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(
|
| const uint8_t* src_buf,
|
| uint32_t src_size,
|
|
|