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) {