Remove out-parameters from FlateModule::FlateOrLZWDecode()
Return a struct DataAndBytesConsumed instead.
Change-Id: I547d641ff32f4b5d478c8f919975d41a0265db90
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/119170
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Thomas Sepez <tsepez@google.com>
diff --git a/core/fpdfapi/parser/fpdf_parser_decode.cpp b/core/fpdfapi/parser/fpdf_parser_decode.cpp
index caeb684..0a7f338 100644
--- a/core/fpdfapi/parser/fpdf_parser_decode.cpp
+++ b/core/fpdfapi/parser/fpdf_parser_decode.cpp
@@ -19,6 +19,7 @@
#include "core/fpdfapi/parser/cpdf_array.h"
#include "core/fpdfapi/parser/cpdf_dictionary.h"
#include "core/fpdfapi/parser/fpdf_parser_utility.h"
+#include "core/fxcodec/data_and_bytes_consumed.h"
#include "core/fxcodec/fax/faxmodule.h"
#include "core/fxcodec/flate/flatemodule.h"
#include "core/fxcodec/scanlinedecoder.h"
@@ -363,9 +364,12 @@
if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns))
return FX_INVALID_OFFSET;
}
- return FlateModule::FlateOrLZWDecode(bLZW, src_span, bEarlyChange, predictor,
- Colors, BitsPerComponent, Columns,
- estimated_size, dest_buf, dest_size);
+ DataAndBytesConsumed result = FlateModule::FlateOrLZWDecode(
+ bLZW, src_span, bEarlyChange, predictor, Colors, BitsPerComponent,
+ Columns, estimated_size);
+ *dest_buf = std::move(result.data);
+ *dest_size = result.size;
+ return result.bytes_consumed;
}
std::optional<DecoderArray> GetDecoderArray(
diff --git a/core/fxcodec/flate/flatemodule.cpp b/core/fxcodec/flate/flatemodule.cpp
index 4933219..bd8ae54 100644
--- a/core/fxcodec/flate/flatemodule.cpp
+++ b/core/fxcodec/flate/flatemodule.cpp
@@ -839,7 +839,7 @@
}
// static
-uint32_t FlateModule::FlateOrLZWDecode(
+DataAndBytesConsumed FlateModule::FlateOrLZWDecode(
bool bLZW,
pdfium::span<const uint8_t> src_span,
bool bEarlyChange,
@@ -847,43 +847,46 @@
int Colors,
int BitsPerComponent,
int Columns,
- uint32_t estimated_size,
- std::unique_ptr<uint8_t, FxFreeDeleter>* dest_buf,
- uint32_t* dest_size) {
- dest_buf->reset();
- uint32_t bytes_consumed = 0;
+ uint32_t estimated_size) {
+ std::unique_ptr<uint8_t, FxFreeDeleter> dest_buf;
+ uint32_t dest_size = 0;
+ uint32_t bytes_consumed = FX_INVALID_OFFSET;
PredictorType predictor_type = GetPredictor(predictor);
if (bLZW) {
auto decoder = std::make_unique<CLZWDecoder>(src_span, bEarlyChange);
if (!decoder->Decode()) {
- return FX_INVALID_OFFSET;
+ return {std::move(dest_buf), dest_size, bytes_consumed};
}
+ dest_buf = decoder->TakeDestBuf();
+ dest_size = decoder->GetDestSize();
bytes_consumed = decoder->GetSrcSize();
- *dest_size = decoder->GetDestSize();
- *dest_buf = decoder->TakeDestBuf();
} else {
DataAndBytesConsumed result = FlateUncompress(src_span, estimated_size);
- *dest_buf = std::move(result.data);
- *dest_size = result.size;
+ dest_buf = std::move(result.data);
+ dest_size = result.size;
bytes_consumed = result.bytes_consumed;
}
bool ret = false;
switch (predictor_type) {
case PredictorType::kNone:
- return bytes_consumed;
+ ret = true;
+ break;
case PredictorType::kPng:
- ret =
- PNG_Predictor(Colors, BitsPerComponent, Columns, dest_buf, dest_size);
+ ret = PNG_Predictor(Colors, BitsPerComponent, Columns, &dest_buf,
+ &dest_size);
break;
case PredictorType::kFlate:
- ret = TIFF_Predictor(Colors, BitsPerComponent, Columns, dest_buf,
- dest_size);
+ ret = TIFF_Predictor(Colors, BitsPerComponent, Columns, &dest_buf,
+ &dest_size);
break;
}
- return ret ? bytes_consumed : FX_INVALID_OFFSET;
+ if (!ret) {
+ bytes_consumed = FX_INVALID_OFFSET;
+ }
+ return {std::move(dest_buf), dest_size, bytes_consumed};
}
// static
diff --git a/core/fxcodec/flate/flatemodule.h b/core/fxcodec/flate/flatemodule.h
index ae581df..0b0f000 100644
--- a/core/fxcodec/flate/flatemodule.h
+++ b/core/fxcodec/flate/flatemodule.h
@@ -11,6 +11,7 @@
#include <memory>
+#include "core/fxcodec/data_and_bytes_consumed.h"
#include "core/fxcrt/data_vector.h"
#include "core/fxcrt/fx_memory_wrappers.h"
#include "core/fxcrt/span.h"
@@ -32,7 +33,7 @@
int BitsPerComponent,
int Columns);
- static uint32_t FlateOrLZWDecode(
+ static DataAndBytesConsumed FlateOrLZWDecode(
bool bLZW,
pdfium::span<const uint8_t> src_span,
bool bEarlyChange,
@@ -40,9 +41,7 @@
int Colors,
int BitsPerComponent,
int Columns,
- uint32_t estimated_size,
- std::unique_ptr<uint8_t, FxFreeDeleter>* dest_buf,
- uint32_t* dest_size);
+ uint32_t estimated_size);
static DataVector<uint8_t> Encode(pdfium::span<const uint8_t> src_span);
diff --git a/core/fxcodec/flate/flatemodule_unittest.cpp b/core/fxcodec/flate/flatemodule_unittest.cpp
index 87e1159..8c2e52c 100644
--- a/core/fxcodec/flate/flatemodule_unittest.cpp
+++ b/core/fxcodec/flate/flatemodule_unittest.cpp
@@ -9,6 +9,7 @@
#include "core/fxcodec/flate/flatemodule.h"
+#include "core/fxcodec/data_and_bytes_consumed.h"
#include "core/fxcrt/compiler_specific.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/test_support.h"
@@ -39,20 +40,16 @@
for (size_t i = 0; i < std::size(flate_decode_cases); ++i) {
const pdfium::DecodeTestData& data = flate_decode_cases[i];
- std::unique_ptr<uint8_t, FxFreeDeleter> buf;
- uint32_t buf_size;
- EXPECT_EQ(
- data.processed_size,
- FlateModule::FlateOrLZWDecode(
- false, UNSAFE_TODO(pdfium::make_span(data.input, data.input_size)),
- false, 0, 0, 0, 0, 0, &buf, &buf_size))
- << " for case " << i;
- ASSERT_TRUE(buf);
- EXPECT_EQ(data.expected_size, buf_size) << " for case " << i;
- if (data.expected_size != buf_size) {
+ DataAndBytesConsumed result = FlateModule::FlateOrLZWDecode(
+ false, UNSAFE_TODO(pdfium::make_span(data.input, data.input_size)),
+ false, 0, 0, 0, 0, 0);
+ EXPECT_EQ(data.processed_size, result.bytes_consumed) << " for case " << i;
+ ASSERT_TRUE(result.data);
+ EXPECT_EQ(data.expected_size, result.size) << " for case " << i;
+ if (data.expected_size != result.size) {
continue;
}
- EXPECT_EQ(0, memcmp(data.expected, buf.get(), data.expected_size))
+ EXPECT_EQ(0, memcmp(data.expected, result.data.get(), data.expected_size))
<< " for case " << i;
}
}
diff --git a/xfa/fxfa/parser/cxfa_localemgr.cpp b/xfa/fxfa/parser/cxfa_localemgr.cpp
index 212a900..e589b67 100644
--- a/xfa/fxfa/parser/cxfa_localemgr.cpp
+++ b/xfa/fxfa/parser/cxfa_localemgr.cpp
@@ -11,6 +11,7 @@
#include <memory>
#include <utility>
+#include "core/fxcodec/data_and_bytes_consumed.h"
#include "core/fxcodec/flate/flatemodule.h"
#include "core/fxcrt/check.h"
#include "core/fxcrt/compiler_specific.h"
@@ -1070,15 +1071,14 @@
if (src_span.empty())
return nullptr;
- std::unique_ptr<uint8_t, FxFreeDeleter> output;
- uint32_t dwSize;
- FlateModule::FlateOrLZWDecode(false, src_span, true, 0, 0, 0, 0, 0, &output,
- &dwSize);
- if (!output)
+ DataAndBytesConsumed result =
+ FlateModule::FlateOrLZWDecode(false, src_span, true, 0, 0, 0, 0, 0);
+ if (!result.data) {
return nullptr;
+ }
return CXFA_XMLLocale::Create(
- heap, UNSAFE_TODO(pdfium::make_span(output.get(), dwSize)));
+ heap, UNSAFE_TODO(pdfium::make_span(result.data.get(), result.size)));
}
CXFA_LocaleMgr::LangID GetLanguageID(WideString wsLanguage) {