Split GifDecoder::Status and CFX_LZWDecoder::Status
They are similar but not quite the same as indicated by a comment
which no longer exists.
Change-Id: Ife27823f2f9fefef881eb4886955a8f202723bc8
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/80692
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxcodec/gif/cfx_gifcontext.cpp b/core/fxcodec/gif/cfx_gifcontext.cpp
index 66dea4b..42f6d9b 100644
--- a/core/fxcodec/gif/cfx_gifcontext.cpp
+++ b/core/fxcodec/gif/cfx_gifcontext.cpp
@@ -240,27 +240,27 @@
SaveDecodingStatus(GIF_D_STATUS_IMG_DATA);
img_row_offset_ += img_row_avail_size_;
img_row_avail_size_ = gif_img_row_bytes - img_row_offset_;
- GifDecoder::Status ret =
+ CFX_LZWDecompressor::Status ret =
lzw_decompressor_.get()
? lzw_decompressor_->Decode(
img_data.data(), img_data_size,
gif_image->row_buffer.data() + img_row_offset_,
&img_row_avail_size_)
- : GifDecoder::Status::kError;
- if (ret == GifDecoder::Status::kError) {
+ : CFX_LZWDecompressor::Status::kError;
+ if (ret == CFX_LZWDecompressor::Status::kError) {
DecodingFailureAtTailCleanup(gif_image);
return GifDecoder::Status::kError;
}
- while (ret != GifDecoder::Status::kError) {
- if (ret == GifDecoder::Status::kSuccess) {
+ while (ret != CFX_LZWDecompressor::Status::kError) {
+ if (ret == CFX_LZWDecompressor::Status::kSuccess) {
ReadScanline(gif_image->row_num, gif_image->row_buffer.data());
gif_image->row_buffer.clear();
SaveDecodingStatus(GIF_D_STATUS_TAIL);
return GifDecoder::Status::kSuccess;
}
- if (ret == GifDecoder::Status::kUnfinished) {
+ if (ret == CFX_LZWDecompressor::Status::kUnfinished) {
read_marker = input_buffer_->GetPosition();
if (!ReadAllOrNone(&img_data_size, sizeof(img_data_size)))
return GifDecoder::Status::kUnfinished;
@@ -284,11 +284,11 @@
img_data.data(), img_data_size,
gif_image->row_buffer.data() + img_row_offset_,
&img_row_avail_size_)
- : GifDecoder::Status::kError;
+ : CFX_LZWDecompressor::Status::kError;
}
}
- if (ret == GifDecoder::Status::kInsufficientDestSize) {
+ if (ret == CFX_LZWDecompressor::Status::kInsufficientDestSize) {
if (gif_image->image_info.local_flags.interlace) {
ReadScanline(gif_image->row_num, gif_image->row_buffer.data());
gif_image->row_num += kGifInterlaceStep[img_pass_num_];
@@ -311,11 +311,11 @@
img_data.data(), img_data_size,
gif_image->row_buffer.data() + img_row_offset_,
&img_row_avail_size_)
- : GifDecoder::Status::kError;
+ : CFX_LZWDecompressor::Status::kError;
}
- if (ret == GifDecoder::Status::kInsufficientDestSize ||
- ret == GifDecoder::Status::kError) {
+ if (ret == CFX_LZWDecompressor::Status::kInsufficientDestSize ||
+ ret == CFX_LZWDecompressor::Status::kError) {
DecodingFailureAtTailCleanup(gif_image);
return GifDecoder::Status::kError;
}
diff --git a/core/fxcodec/gif/cfx_lzwdecompressor.cpp b/core/fxcodec/gif/cfx_lzwdecompressor.cpp
index 3b8fa62..144dca6 100644
--- a/core/fxcodec/gif/cfx_lzwdecompressor.cpp
+++ b/core/fxcodec/gif/cfx_lzwdecompressor.cpp
@@ -35,15 +35,15 @@
CFX_LZWDecompressor::~CFX_LZWDecompressor() = default;
-GifDecoder::Status CFX_LZWDecompressor::Decode(const uint8_t* src_buf,
- uint32_t src_size,
- uint8_t* dest_buf,
- uint32_t* dest_size) {
+CFX_LZWDecompressor::Status CFX_LZWDecompressor::Decode(const uint8_t* src_buf,
+ uint32_t src_size,
+ uint8_t* dest_buf,
+ uint32_t* dest_size) {
if (!src_buf || src_size == 0 || !dest_buf || !dest_size)
- return GifDecoder::Status::kError;
+ return Status::kError;
if (*dest_size == 0)
- return GifDecoder::Status::kInsufficientDestSize;
+ return Status::kInsufficientDestSize;
next_in_ = src_buf;
avail_in_ = src_size;
@@ -54,7 +54,7 @@
if (decompressed_next_ != 0) {
uint32_t extracted_size = ExtractData(dest_buf, *dest_size);
if (decompressed_next_ != 0)
- return GifDecoder::Status::kInsufficientDestSize;
+ return Status::kInsufficientDestSize;
dest_buf += extracted_size;
i += extracted_size;
@@ -62,17 +62,17 @@
while (i <= *dest_size && (avail_in_ > 0 || bits_left_ >= code_size_cur_)) {
if (code_size_cur_ > GIF_MAX_LZW_EXP)
- return GifDecoder::Status::kError;
+ return Status::kError;
if (avail_in_ > 0) {
if (bits_left_ > 31)
- return GifDecoder::Status::kError;
+ return Status::kError;
FX_SAFE_UINT32 safe_code = *next_in_++;
safe_code <<= bits_left_;
safe_code |= code_store_;
if (!safe_code.IsValid())
- return GifDecoder::Status::kError;
+ return Status::kError;
code_store_ = safe_code.ValueOrDie();
--avail_in_;
@@ -90,7 +90,7 @@
}
if (code == code_end_) {
*dest_size = i;
- return GifDecoder::Status::kSuccess;
+ return Status::kSuccess;
}
if (code_old_ != static_cast<uint16_t>(-1)) {
@@ -98,12 +98,12 @@
if (code == code_next_) {
AddCode(code_old_, code_first_);
if (!DecodeString(code))
- return GifDecoder::Status::kError;
+ return Status::kError;
} else if (code > code_next_) {
- return GifDecoder::Status::kError;
+ return Status::kError;
} else {
if (!DecodeString(code))
- return GifDecoder::Status::kError;
+ return Status::kError;
uint8_t append_char = decompressed_[decompressed_next_ - 1];
AddCode(code_old_, append_char);
@@ -111,13 +111,13 @@
}
} else {
if (!DecodeString(code))
- return GifDecoder::Status::kError;
+ return Status::kError;
}
code_old_ = code;
uint32_t extracted_size = ExtractData(dest_buf, *dest_size - i);
if (decompressed_next_ != 0)
- return GifDecoder::Status::kInsufficientDestSize;
+ return Status::kInsufficientDestSize;
dest_buf += extracted_size;
i += extracted_size;
@@ -125,10 +125,10 @@
}
if (avail_in_ != 0)
- return GifDecoder::Status::kError;
+ return Status::kError;
*dest_size = i;
- return GifDecoder::Status::kUnfinished;
+ return Status::kUnfinished;
}
void CFX_LZWDecompressor::ClearTable() {
diff --git a/core/fxcodec/gif/cfx_lzwdecompressor.h b/core/fxcodec/gif/cfx_lzwdecompressor.h
index 979686c..f1628ac 100644
--- a/core/fxcodec/gif/cfx_lzwdecompressor.h
+++ b/core/fxcodec/gif/cfx_lzwdecompressor.h
@@ -11,11 +11,17 @@
#include <vector>
#include "core/fxcodec/gif/cfx_gif.h"
-#include "core/fxcodec/gif/gif_decoder.h"
#include "core/fxcrt/fx_memory_wrappers.h"
class CFX_LZWDecompressor {
public:
+ enum class Status {
+ kError,
+ kSuccess,
+ kUnfinished,
+ kInsufficientDestSize,
+ };
+
struct CodeEntry {
uint16_t prefix;
uint8_t suffix;
@@ -26,10 +32,10 @@
uint8_t code_exp);
~CFX_LZWDecompressor();
- GifDecoder::Status Decode(const uint8_t* src_buf,
- uint32_t src_size,
- uint8_t* dest_buf,
- uint32_t* dest_size);
+ Status Decode(const uint8_t* src_buf,
+ uint32_t src_size,
+ uint8_t* dest_buf,
+ uint32_t* dest_size);
// Used by unittests, should not be called in production code.
uint32_t ExtractDataForTest(uint8_t* dest_buf, uint32_t dest_size) {
diff --git a/core/fxcodec/gif/cfx_lzwdecompressor_unittest.cpp b/core/fxcodec/gif/cfx_lzwdecompressor_unittest.cpp
index e952fa0..1e42c1b 100644
--- a/core/fxcodec/gif/cfx_lzwdecompressor_unittest.cpp
+++ b/core/fxcodec/gif/cfx_lzwdecompressor_unittest.cpp
@@ -92,19 +92,19 @@
uint32_t output_size = pdfium::size(output_data);
EXPECT_EQ(
- GifDecoder::Status::kError,
+ CFX_LZWDecompressor::Status::kError,
decompressor->Decode(nullptr, image_size, output_data, &output_size));
- EXPECT_EQ(GifDecoder::Status::kError,
+ EXPECT_EQ(CFX_LZWDecompressor::Status::kError,
decompressor->Decode(image_data, 0, output_data, &output_size));
EXPECT_EQ(
- GifDecoder::Status::kError,
+ CFX_LZWDecompressor::Status::kError,
decompressor->Decode(image_data, image_size, nullptr, &output_size));
- EXPECT_EQ(GifDecoder::Status::kError,
+ EXPECT_EQ(CFX_LZWDecompressor::Status::kError,
decompressor->Decode(image_data, image_size, output_data, nullptr));
output_size = 0;
EXPECT_EQ(
- GifDecoder::Status::kInsufficientDestSize,
+ CFX_LZWDecompressor::Status::kInsufficientDestSize,
decompressor->Decode(image_data, image_size, output_data, &output_size));
}
@@ -123,7 +123,7 @@
uint32_t output_size = pdfium::size(output_data);
EXPECT_EQ(
- GifDecoder::Status::kSuccess,
+ CFX_LZWDecompressor::Status::kSuccess,
decompressor->Decode(image_data, image_size, output_data, &output_size));
EXPECT_EQ(pdfium::size(output_data), output_size);
@@ -155,7 +155,7 @@
uint32_t output_size = pdfium::size(output_data);
EXPECT_EQ(
- GifDecoder::Status::kSuccess,
+ CFX_LZWDecompressor::Status::kSuccess,
decompressor->Decode(kImageData, image_size, output_data, &output_size));
EXPECT_EQ(pdfium::size(output_data), output_size);
@@ -189,7 +189,7 @@
uint32_t output_size = pdfium::size(output_data);
EXPECT_EQ(
- GifDecoder::Status::kSuccess,
+ CFX_LZWDecompressor::Status::kSuccess,
decompressor->Decode(kImageData, image_size, output_data, &output_size));
EXPECT_EQ(pdfium::size(output_data), output_size);
@@ -214,6 +214,6 @@
uint32_t output_size = pdfium::size(output_data);
EXPECT_EQ(
- GifDecoder::Status::kError,
+ CFX_LZWDecompressor::Status::kError,
decompressor->Decode(kImageData, image_size, output_data, &output_size));
}
diff --git a/core/fxcodec/gif/gif_decoder.h b/core/fxcodec/gif/gif_decoder.h
index 9a4df57..53b665a 100644
--- a/core/fxcodec/gif/gif_decoder.h
+++ b/core/fxcodec/gif/gif_decoder.h
@@ -28,7 +28,6 @@
kError,
kSuccess,
kUnfinished,
- kInsufficientDestSize, // Only used internally by CGifLZWDecoder::Decode()
};
class Delegate {
diff --git a/testing/fuzzers/pdf_lzw_fuzzer.cc b/testing/fuzzers/pdf_lzw_fuzzer.cc
index e868ae4..9ab5886 100644
--- a/testing/fuzzers/pdf_lzw_fuzzer.cc
+++ b/testing/fuzzers/pdf_lzw_fuzzer.cc
@@ -27,7 +27,7 @@
// This cast should be safe since the caller is checking for overflow on
// the initial data.
uint32_t dest_size = static_cast<uint32_t>(dest_buf.size());
- if (GifDecoder::Status::kInsufficientDestSize !=
+ if (CFX_LZWDecompressor::Status::kInsufficientDestSize !=
decompressor->Decode(src_buf, src_size, dest_buf.data(), &dest_size)) {
return;
}