Do more input checks inside BC_DefaultPlacement.cpp.

- Check the col/row count in the constructor.
- Use Fx2DSizeOrDie() to prevent integer overflows.
- (D)CHECK() all col/row inputs.

Change-Id: If68a19a103e21b62eae556c53340618886fcb6da
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/98312
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/fxbarcode/datamatrix/BC_DefaultPlacement.cpp b/fxbarcode/datamatrix/BC_DefaultPlacement.cpp
index dc95b4d..250be4d 100644
--- a/fxbarcode/datamatrix/BC_DefaultPlacement.cpp
+++ b/fxbarcode/datamatrix/BC_DefaultPlacement.cpp
@@ -27,7 +27,17 @@
 #include <utility>
 
 #include "core/fxcrt/data_vector.h"
+#include "core/fxcrt/fx_memory.h"
 #include "fxbarcode/datamatrix/BC_Encoder.h"
+#include "third_party/base/check_op.h"
+
+namespace {
+
+size_t GetIndex(size_t col, size_t row, size_t num_cols) {
+  return row * num_cols + col;
+}
+
+}  // namespace
 
 CBC_DefaultPlacement::CBC_DefaultPlacement(WideString codewords,
                                            int32_t numcols,
@@ -35,22 +45,36 @@
     : m_codewords(std::move(codewords)),
       m_numrows(numrows),
       m_numcols(numcols),
-      m_bits(numcols * numrows, 2) {
+      m_bits(Fx2DSizeOrDie(numcols, numrows), 2) {
+  CHECK_GT(m_numrows, 0);
+  CHECK_GT(m_numcols, 0);
   Init();
 }
 
 CBC_DefaultPlacement::~CBC_DefaultPlacement() = default;
 
 bool CBC_DefaultPlacement::GetBit(int32_t col, int32_t row) const {
-  return m_bits[row * m_numcols + col] == 1;
+  CHECK_GE(col, 0);
+  CHECK_GE(row, 0);
+  CHECK_LT(col, m_numcols);
+  CHECK_LT(row, m_numrows);
+  return m_bits[GetIndex(col, row, m_numcols)] == 1;
 }
 
 void CBC_DefaultPlacement::SetBit(int32_t col, int32_t row, bool bit) {
-  m_bits[row * m_numcols + col] = bit ? 1 : 0;
+  DCHECK_GE(col, 0);
+  DCHECK_GE(row, 0);
+  DCHECK_LT(col, m_numcols);
+  DCHECK_LT(row, m_numrows);
+  m_bits[GetIndex(col, row, m_numcols)] = bit ? 1 : 0;
 }
 
 bool CBC_DefaultPlacement::HasBit(int32_t col, int32_t row) const {
-  return m_bits[row * m_numcols + col] != 2;
+  DCHECK_GE(col, 0);
+  DCHECK_GE(row, 0);
+  DCHECK_LT(col, m_numcols);
+  DCHECK_LT(row, m_numrows);
+  return m_bits[GetIndex(col, row, m_numcols)] != 2;
 }
 
 void CBC_DefaultPlacement::Init() {