Fix some arithmetic nits in CBC_CommonBitMatrix. - make m_bits unsigned to avoid bitwise ops on signed values. - avoid possibility of UB with signed 1 shifted by 31. - limit total matrix size to avoid overflows. - avoid OOB writes in Set(). Change-Id: I8b9f518af34e4ac9a1638f54523797014dc0bfe9 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/90993 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fxbarcode/common/BC_CommonBitMatrix.cpp b/fxbarcode/common/BC_CommonBitMatrix.cpp index 7a91865..6c82a9f 100644 --- a/fxbarcode/common/BC_CommonBitMatrix.cpp +++ b/fxbarcode/common/BC_CommonBitMatrix.cpp
@@ -23,29 +23,35 @@ #include "fxbarcode/common/BC_CommonBitMatrix.h" #include "core/fxcrt/stl_util.h" -#include "third_party/base/check.h" +#include "third_party/base/check_op.h" CBC_CommonBitMatrix::CBC_CommonBitMatrix() = default; void CBC_CommonBitMatrix::Init(int32_t width, int32_t height) { + CHECK_GE(width, 0); + CHECK_GE(height, 0); + + static constexpr int32_t kMaxBits = 1024 * 1024 * 1024; // 1 Gb. + CHECK_LT(width, kMaxBits / height); + m_width = width; m_height = height; m_rowSize = (width + 31) >> 5; - m_bits = fxcrt::Vector2D<int32_t>(m_rowSize, m_height); + m_bits = fxcrt::Vector2D<uint32_t>(m_rowSize, m_height); } CBC_CommonBitMatrix::~CBC_CommonBitMatrix() = default; bool CBC_CommonBitMatrix::Get(int32_t x, int32_t y) const { int32_t offset = y * m_rowSize + (x >> 5); - if (offset >= m_rowSize * m_height || offset < 0) + if (offset < 0 || offset >= m_rowSize * m_height) return false; - return ((((uint32_t)m_bits[offset]) >> (x & 0x1f)) & 1) != 0; + return ((m_bits[offset] >> (x & 0x1f)) & 1) != 0; } void CBC_CommonBitMatrix::Set(int32_t x, int32_t y) { int32_t offset = y * m_rowSize + (x >> 5); - DCHECK(offset >= 0); - DCHECK(offset < m_rowSize * m_height); - m_bits[offset] |= 1 << (x & 0x1f); + if (offset < 0 || offset >= m_rowSize * m_height) + return; + m_bits[offset] |= 1u << (x & 0x1f); }
diff --git a/fxbarcode/common/BC_CommonBitMatrix.h b/fxbarcode/common/BC_CommonBitMatrix.h index 7182a52..f862550 100644 --- a/fxbarcode/common/BC_CommonBitMatrix.h +++ b/fxbarcode/common/BC_CommonBitMatrix.h
@@ -27,7 +27,7 @@ int32_t m_width = 0; int32_t m_height = 0; int32_t m_rowSize = 0; - std::vector<int32_t> m_bits; + std::vector<uint32_t> m_bits; }; #endif // FXBARCODE_COMMON_BC_COMMONBITMATRIX_H_