Avoid uninit value in CBC_PDF417I::Encode()
Change CBC_PDF417Writer::Encode() to return a struct instead of using
out-parameters. Thus helping to make sure all the return paths return
width / height values.
Also mark Encode() as const, and move CBC_PDF417Writer::RotateArray()
into an anonymous namespace.
Bug: 342428942
Change-Id: If166a1679ebac5719460d506c59c043199f0e201
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/119593
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Thomas Sepez <tsepez@google.com>
diff --git a/fxbarcode/cbc_pdf417i.cpp b/fxbarcode/cbc_pdf417i.cpp
index cb237a9..54a7f42 100644
--- a/fxbarcode/cbc_pdf417i.cpp
+++ b/fxbarcode/cbc_pdf417i.cpp
@@ -45,11 +45,9 @@
if (contents.GetLength() > kMaxPDF417InputLengthBytes)
return false;
- int32_t width;
- int32_t height;
auto* pWriter = GetPDF417Writer();
- DataVector<uint8_t> data = pWriter->Encode(contents, &width, &height);
- return pWriter->RenderResult(data, width, height);
+ CBC_PDF417Writer::EncodeResult result = pWriter->Encode(contents);
+ return pWriter->RenderResult(result.data, result.width, result.height);
}
bool CBC_PDF417I::RenderDevice(CFX_RenderDevice* device,
diff --git a/fxbarcode/pdf417/BC_PDF417Writer.cpp b/fxbarcode/pdf417/BC_PDF417Writer.cpp
index a7ed452..2999552 100644
--- a/fxbarcode/pdf417/BC_PDF417Writer.cpp
+++ b/fxbarcode/pdf417/BC_PDF417Writer.cpp
@@ -34,6 +34,20 @@
#include "fxbarcode/pdf417/BC_PDF417.h"
#include "fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h"
+namespace {
+
+void RotateArray(DataVector<uint8_t>& bitarray, int32_t width, int32_t height) {
+ DataVector<uint8_t> temp = bitarray;
+ for (int32_t i = 0; i < height; i++) {
+ int32_t inverse_i = height - i - 1;
+ for (int32_t j = 0; j < width; j++) {
+ bitarray[j * height + inverse_i] = temp[i * width + j];
+ }
+ }
+}
+
+} // namespace
+
CBC_PDF417Writer::CBC_PDF417Writer() : CBC_TwoDimWriter(false) {}
CBC_PDF417Writer::~CBC_PDF417Writer() = default;
@@ -46,9 +60,8 @@
return true;
}
-DataVector<uint8_t> CBC_PDF417Writer::Encode(WideStringView contents,
- int32_t* pOutWidth,
- int32_t* pOutHeight) {
+CBC_PDF417Writer::EncodeResult CBC_PDF417Writer::Encode(
+ WideStringView contents) const {
CBC_PDF417 encoder;
int32_t col = (m_Width / m_ModuleWidth - 69) / 17;
int32_t row = m_Height / (m_ModuleWidth * 20);
@@ -58,31 +71,25 @@
encoder.setDimensions(col, col, 90, 3);
else if (row >= 3 && row <= 90)
encoder.setDimensions(30, 1, row, row);
- if (!encoder.GenerateBarcodeLogic(contents, error_correction_level()))
- return DataVector<uint8_t>();
+ if (!encoder.GenerateBarcodeLogic(contents, error_correction_level())) {
+ return {DataVector<uint8_t>(), 0, 0};
+ }
CBC_BarcodeMatrix* barcodeMatrix = encoder.getBarcodeMatrix();
- DataVector<uint8_t> matrixData = barcodeMatrix->toBitArray();
- int32_t matrixWidth = barcodeMatrix->getWidth();
- int32_t matrixHeight = barcodeMatrix->getHeight();
+ DataVector<uint8_t> matrix_data = barcodeMatrix->toBitArray();
+ int32_t matrix_width = barcodeMatrix->getWidth();
+ int32_t matrix_height = barcodeMatrix->getHeight();
- if (matrixWidth < matrixHeight) {
- RotateArray(&matrixData, matrixHeight, matrixWidth);
- std::swap(matrixWidth, matrixHeight);
+ if (matrix_width < matrix_height) {
+ RotateArray(matrix_data, matrix_width, matrix_height);
+ std::swap(matrix_width, matrix_height);
}
- *pOutWidth = matrixWidth;
- *pOutHeight = matrixHeight;
- return matrixData;
+ return {std::move(matrix_data), matrix_width, matrix_height};
}
-void CBC_PDF417Writer::RotateArray(DataVector<uint8_t>* bitarray,
- int32_t height,
- int32_t width) {
- DataVector<uint8_t> temp = *bitarray;
- for (int32_t ii = 0; ii < height; ii++) {
- int32_t inverseii = height - ii - 1;
- for (int32_t jj = 0; jj < width; jj++) {
- (*bitarray)[jj * height + inverseii] = temp[ii * width + jj];
- }
- }
-}
+CBC_PDF417Writer::EncodeResult::EncodeResult(DataVector<uint8_t> data,
+ int32_t width,
+ int32_t height)
+ : data(std::move(data)), width(width), height(height) {}
+
+CBC_PDF417Writer::EncodeResult::~EncodeResult() = default;
diff --git a/fxbarcode/pdf417/BC_PDF417Writer.h b/fxbarcode/pdf417/BC_PDF417Writer.h
index dc1f1f4..cb9a1c1 100644
--- a/fxbarcode/pdf417/BC_PDF417Writer.h
+++ b/fxbarcode/pdf417/BC_PDF417Writer.h
@@ -16,20 +16,22 @@
class CBC_PDF417Writer final : public CBC_TwoDimWriter {
public:
+ struct EncodeResult {
+ EncodeResult(DataVector<uint8_t> data, int32_t width, int32_t height);
+ ~EncodeResult();
+
+ DataVector<uint8_t> data;
+ int32_t width;
+ int32_t height;
+ };
+
CBC_PDF417Writer();
~CBC_PDF417Writer() override;
- DataVector<uint8_t> Encode(WideStringView contents,
- int32_t* pOutWidth,
- int32_t* pOutHeight);
+ EncodeResult Encode(WideStringView contents) const;
// CBC_TwoDimWriter
bool SetErrorCorrectionLevel(int32_t level) override;
-
- private:
- void RotateArray(DataVector<uint8_t>* bitarray,
- int32_t width,
- int32_t height);
};
#endif // FXBARCODE_PDF417_BC_PDF417WRITER_H_
diff --git a/fxbarcode/pdf417/BC_PDF417Writer_unittest.cpp b/fxbarcode/pdf417/BC_PDF417Writer_unittest.cpp
index 2bcb1c3..55ed23c 100644
--- a/fxbarcode/pdf417/BC_PDF417Writer_unittest.cpp
+++ b/fxbarcode/pdf417/BC_PDF417Writer_unittest.cpp
@@ -26,8 +26,6 @@
TEST_F(CBC_PDF417WriterTest, Encode) {
CBC_PDF417Writer writer;
- int32_t width;
- int32_t height;
{
static constexpr int kExpectedWidth = 579;
@@ -419,12 +417,12 @@
1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1,
0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1,
1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1};
- DataVector<uint8_t> data = writer.Encode(L"", &width, &height);
- ASSERT_EQ(std::size(kExpectedData), data.size());
- ASSERT_EQ(kExpectedWidth, width);
- ASSERT_EQ(kExpectedHeight, height);
+ CBC_PDF417Writer::EncodeResult result = writer.Encode(L"");
+ ASSERT_EQ(std::size(kExpectedData), result.data.size());
+ ASSERT_EQ(kExpectedWidth, result.width);
+ ASSERT_EQ(kExpectedHeight, result.height);
for (size_t i = 0; i < std::size(kExpectedData); ++i)
- EXPECT_EQ(kExpectedData[i], data[i]) << i;
+ EXPECT_EQ(kExpectedData[i], result.data[i]) << i;
}
{
static constexpr int kExpectedWidth = 579;
@@ -816,11 +814,11 @@
1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0,
0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1,
1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1};
- DataVector<uint8_t> data = writer.Encode(L"hello world", &width, &height);
- ASSERT_EQ(std::size(kExpectedData), data.size());
- ASSERT_EQ(kExpectedWidth, width);
- ASSERT_EQ(kExpectedHeight, height);
+ CBC_PDF417Writer::EncodeResult result = writer.Encode(L"hello world");
+ ASSERT_EQ(std::size(kExpectedData), result.data.size());
+ ASSERT_EQ(kExpectedWidth, result.width);
+ ASSERT_EQ(kExpectedHeight, result.height);
for (size_t i = 0; i < std::size(kExpectedData); ++i)
- EXPECT_EQ(kExpectedData[i], data[i]) << i;
+ EXPECT_EQ(kExpectedData[i], result.data[i]) << i;
}
}