OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "core/fxcodec/codec/codec_int.h" | 7 #include "core/fxcodec/codec/codec_int.h" |
8 #include "core/fxcodec/include/fx_codec.h" | 8 #include "core/fxcodec/include/fx_codec.h" |
9 | 9 |
10 namespace { | 10 namespace { |
(...skipping 18 matching lines...) Expand all Loading... |
29 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 29 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
30 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 30 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
31 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 31 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
32 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 32 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
33 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 33 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
34 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | 34 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
35 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | 35 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, |
36 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8, | 36 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8, |
37 }; | 37 }; |
38 | 38 |
| 39 // Limit of image dimension, an arbitrary large number. |
| 40 const int kMaxImageDimension = 0x01FFFF; |
| 41 |
39 int FindBit(const uint8_t* data_buf, int max_pos, int start_pos, int bit) { | 42 int FindBit(const uint8_t* data_buf, int max_pos, int start_pos, int bit) { |
| 43 ASSERT(start_pos >= 0); |
40 if (start_pos >= max_pos) { | 44 if (start_pos >= max_pos) { |
41 return max_pos; | 45 return max_pos; |
42 } | 46 } |
43 const uint8_t* leading_pos = bit ? OneLeadPos : ZeroLeadPos; | 47 const uint8_t* leading_pos = bit ? OneLeadPos : ZeroLeadPos; |
44 if (start_pos % 8) { | 48 if (start_pos % 8) { |
45 uint8_t data = data_buf[start_pos / 8]; | 49 uint8_t data = data_buf[start_pos / 8]; |
46 if (bit) { | 50 if (bit) { |
47 data &= 0xff >> (start_pos % 8); | 51 data &= 0xff >> (start_pos % 8); |
48 } else { | 52 } else { |
49 data |= 0xff << (8 - start_pos % 8); | 53 data |= 0xff << (8 - start_pos % 8); |
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 m_Encoding = K; | 508 m_Encoding = K; |
505 m_bEndOfLine = EndOfLine; | 509 m_bEndOfLine = EndOfLine; |
506 m_bByteAlign = EncodedByteAlign; | 510 m_bByteAlign = EncodedByteAlign; |
507 m_bBlack = BlackIs1; | 511 m_bBlack = BlackIs1; |
508 m_OrigWidth = Columns; | 512 m_OrigWidth = Columns; |
509 m_OrigHeight = Rows; | 513 m_OrigHeight = Rows; |
510 if (m_OrigWidth == 0) | 514 if (m_OrigWidth == 0) |
511 m_OrigWidth = width; | 515 m_OrigWidth = width; |
512 if (m_OrigHeight == 0) | 516 if (m_OrigHeight == 0) |
513 m_OrigHeight = height; | 517 m_OrigHeight = height; |
514 // Should not overflow. Checked by FPDFAPI_CreateFaxDecoder. | 518 // Should not overflow. Checked by CCodec_FaxDecoder::CreateDecoder. |
515 m_Pitch = (static_cast<uint32_t>(m_OrigWidth) + 31) / 32 * 4; | 519 m_Pitch = (static_cast<uint32_t>(m_OrigWidth) + 31) / 32 * 4; |
516 m_OutputWidth = m_OrigWidth; | 520 m_OutputWidth = m_OrigWidth; |
517 m_OutputHeight = m_OrigHeight; | 521 m_OutputHeight = m_OrigHeight; |
518 m_pScanlineBuf = FX_Alloc(uint8_t, m_Pitch); | 522 m_pScanlineBuf = FX_Alloc(uint8_t, m_Pitch); |
519 m_pRefBuf = FX_Alloc(uint8_t, m_Pitch); | 523 m_pRefBuf = FX_Alloc(uint8_t, m_Pitch); |
520 m_pSrcBuf = src_buf; | 524 m_pSrcBuf = src_buf; |
521 m_SrcSize = src_size; | 525 m_SrcSize = src_size; |
522 m_nComps = 1; | 526 m_nComps = 1; |
523 m_bpc = 1; | 527 m_bpc = 1; |
524 } | 528 } |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
617 const uint8_t* src_buf, | 621 const uint8_t* src_buf, |
618 uint32_t src_size, | 622 uint32_t src_size, |
619 int width, | 623 int width, |
620 int height, | 624 int height, |
621 int K, | 625 int K, |
622 FX_BOOL EndOfLine, | 626 FX_BOOL EndOfLine, |
623 FX_BOOL EncodedByteAlign, | 627 FX_BOOL EncodedByteAlign, |
624 FX_BOOL BlackIs1, | 628 FX_BOOL BlackIs1, |
625 int Columns, | 629 int Columns, |
626 int Rows) { | 630 int Rows) { |
| 631 // Reject invalid values. |
| 632 if (width <= 0 || height < 0 || Columns < 0 || Rows < 0) |
| 633 return nullptr; |
| 634 // Reject unreasonable large input. |
| 635 if (width > kMaxImageDimension || height > kMaxImageDimension || |
| 636 Columns > kMaxImageDimension || Rows > kMaxImageDimension) |
| 637 return nullptr; |
627 return new CCodec_FaxDecoder(src_buf, src_size, width, height, K, EndOfLine, | 638 return new CCodec_FaxDecoder(src_buf, src_size, width, height, K, EndOfLine, |
628 EncodedByteAlign, BlackIs1, Columns, Rows); | 639 EncodedByteAlign, BlackIs1, Columns, Rows); |
629 } | 640 } |
OLD | NEW |