Use Fx2DSizeOrDie() in more places inside cfx_dibbase.cpp.

Avoid integer overflows.

Bug: chromium:1403634
Change-Id: I2ca7cce778f6546db53c508e880d43af5a4d85d9
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/103093
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxge/dib/cfx_dibbase.cpp b/core/fxge/dib/cfx_dibbase.cpp
index da38fec..4da06ae 100644
--- a/core/fxge/dib/cfx_dibbase.cpp
+++ b/core/fxge/dib/cfx_dibbase.cpp
@@ -81,7 +81,8 @@
   for (int row = 0; row < height; ++row) {
     pdfium::span<const uint8_t> scan_line = pBitmap->GetScanline(row);
     for (int col = 0; col < width; ++col) {
-      const uint8_t* src_port = scan_line.subspan(col * bpp).data();
+      const uint8_t* src_port =
+          scan_line.subspan(Fx2DSizeOrDie(col, bpp)).data();
       uint32_t b = src_port[0] & 0xf0;
       uint32_t g = src_port[1] & 0xf0;
       uint32_t r = src_port[2] & 0xf0;
@@ -117,7 +118,8 @@
   static constexpr uint8_t kSetGray = 0xff;
   static constexpr uint8_t kResetGray = 0x00;
   for (int row = 0; row < height; ++row) {
-    pdfium::span<uint8_t> dest_span = dest_buf.subspan(row * dest_pitch);
+    pdfium::span<uint8_t> dest_span =
+        dest_buf.subspan(Fx2DSizeOrDie(row, dest_pitch));
     pdfium::span<const uint8_t> src_span =
         pSrcBitmap->GetScanline(src_top + row);
     fxcrt::spanset(dest_span.first(width), kResetGray);
@@ -140,7 +142,7 @@
                                  int src_top) {
   for (int row = 0; row < height; ++row) {
     fxcrt::spancpy(
-        dest_buf.subspan(row * dest_pitch),
+        dest_buf.subspan(Fx2DSizeOrDie(row, dest_pitch)),
         pSrcBitmap->GetScanline(src_top + row).subspan(src_left, width));
   }
 }
@@ -163,7 +165,8 @@
   const uint8_t gray1 = FXRGB2GRAY(set_r, set_g, set_b);
 
   for (int row = 0; row < height; ++row) {
-    pdfium::span<uint8_t> dest_span = dest_buf.subspan(row * dest_pitch);
+    pdfium::span<uint8_t> dest_span =
+        dest_buf.subspan(Fx2DSizeOrDie(row, dest_pitch));
     fxcrt::spanset(dest_span.first(width), gray0);
     uint8_t* dest_scan = dest_span.data();
     const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row).data();
@@ -190,7 +193,8 @@
   }
 
   for (int row = 0; row < height; ++row) {
-    uint8_t* dest_scan = dest_buf.subspan(row * dest_pitch).data();
+    uint8_t* dest_scan =
+        dest_buf.subspan(Fx2DSizeOrDie(row, dest_pitch)).data();
     const uint8_t* src_scan =
         pSrcBitmap->GetScanline(src_top + row).subspan(src_left).data();
     for (int col = 0; col < width; ++col)
@@ -207,7 +211,8 @@
                             int src_top) {
   int Bpp = pSrcBitmap->GetBPP() / 8;
   for (int row = 0; row < height; ++row) {
-    uint8_t* dest_scan = dest_buf.subspan(row * dest_pitch).data();
+    uint8_t* dest_scan =
+        dest_buf.subspan(Fx2DSizeOrDie(row, dest_pitch)).data();
     const uint8_t* src_scan =
         pSrcBitmap->GetScanline(src_top + row).subspan(src_left * Bpp).data();
     for (int col = 0; col < width; ++col) {
@@ -226,7 +231,8 @@
                              int src_top) {
   if (pSrcBitmap->GetBPP() == 1) {
     for (int row = 0; row < height; ++row) {
-      pdfium::span<uint8_t> dest_span = dest_buf.subspan(row * dest_pitch);
+      pdfium::span<uint8_t> dest_span =
+          dest_buf.subspan(Fx2DSizeOrDie(row, dest_pitch));
       // Set all destination pixels to be white initially.
       fxcrt::spanset(dest_span.first(width), 255);
       uint8_t* dest_scan = dest_span.data();
@@ -242,7 +248,7 @@
   } else {
     for (int row = 0; row < height; ++row) {
       fxcrt::spancpy(
-          dest_buf.subspan(row * dest_pitch),
+          dest_buf.subspan(Fx2DSizeOrDie(row, dest_pitch)),
           pSrcBitmap->GetScanline(src_top + row).subspan(src_left, width));
     }
   }
@@ -309,9 +315,10 @@
   for (int row = 0; row < height; ++row) {
     const uint8_t* src_scan =
         pSrcBitmap->GetScanline(src_top + row).subspan(src_left).data();
-    uint8_t* dest_scan = dest_buf.subspan(row * dest_pitch).data();
+    uint8_t* dest_scan =
+        dest_buf.subspan(Fx2DSizeOrDie(row, dest_pitch)).data();
     for (int col = 0; col < width; ++col) {
-      const uint8_t* src_port = src_scan + col * bpp;
+      const uint8_t* src_port = src_scan + Fx2DSizeOrDie(col, bpp);
       int r = src_port[2] & 0xf0;
       int g = src_port[1] & 0xf0;
       int b = src_port[0] & 0xf0;
@@ -339,7 +346,8 @@
   static constexpr uint8_t kSetGray = 0xff;
   static constexpr uint8_t kResetGray = 0x00;
   for (int row = 0; row < height; ++row) {
-    uint8_t* dest_scan = dest_buf.subspan(row * dest_pitch).data();
+    uint8_t* dest_scan =
+        dest_buf.subspan(Fx2DSizeOrDie(row, dest_pitch)).data();
     const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row).data();
     for (int col = src_left; col < src_left + width; ++col) {
       uint8_t value =
@@ -360,7 +368,8 @@
                                 int src_top) {
   int comps = GetCompsFromFormat(dest_format);
   for (int row = 0; row < height; ++row) {
-    uint8_t* dest_scan = dest_buf.subspan(row * dest_pitch).data();
+    uint8_t* dest_scan =
+        dest_buf.subspan(Fx2DSizeOrDie(row, dest_pitch)).data();
     const uint8_t* src_scan =
         pSrcBitmap->GetScanline(src_top + row).subspan(src_left).data();
     for (int col = 0; col < width; ++col) {
@@ -386,7 +395,8 @@
       FXARGB_G(src_palette[1]), FXARGB_R(src_palette[1])};
   int comps = GetCompsFromFormat(dest_format);
   for (int row = 0; row < height; ++row) {
-    uint8_t* dest_scan = dest_buf.subspan(row * dest_pitch).data();
+    uint8_t* dest_scan =
+        dest_buf.subspan(Fx2DSizeOrDie(row, dest_pitch)).data();
     const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row).data();
     for (int col = src_left; col < src_left + width; ++col) {
       size_t offset = (src_scan[col / 8] & (1 << (7 - col % 8))) ? 3 : 0;
@@ -413,7 +423,8 @@
   }
   int comps = GetCompsFromFormat(dest_format);
   for (int row = 0; row < height; ++row) {
-    uint8_t* dest_scan = dest_buf.subspan(row * dest_pitch).data();
+    uint8_t* dest_scan =
+        dest_buf.subspan(Fx2DSizeOrDie(row, dest_pitch)).data();
     const uint8_t* src_scan =
         pSrcBitmap->GetScanline(src_top + row).subspan(src_left).data();
     for (int col = 0; col < width; ++col) {
@@ -433,7 +444,7 @@
     int src_left,
     int src_top) {
   for (int row = 0; row < height; ++row) {
-    fxcrt::spancpy(dest_buf.subspan(row * dest_pitch),
+    fxcrt::spancpy(dest_buf.subspan(Fx2DSizeOrDie(row, dest_pitch)),
                    pSrcBitmap->GetScanline(src_top + row)
                        .subspan(src_left * 3, width * 3));
   }
@@ -448,7 +459,8 @@
     int src_left,
     int src_top) {
   for (int row = 0; row < height; ++row) {
-    uint8_t* dest_scan = dest_buf.subspan(row * dest_pitch).data();
+    uint8_t* dest_scan =
+        dest_buf.subspan(Fx2DSizeOrDie(row, dest_pitch)).data();
     const uint8_t* src_scan =
         pSrcBitmap->GetScanline(src_top + row).subspan(src_left * 4).data();
     for (int col = 0; col < width; ++col) {
@@ -468,7 +480,8 @@
                              int src_top) {
   int comps = pSrcBitmap->GetBPP() / 8;
   for (int row = 0; row < height; ++row) {
-    uint8_t* dest_scan = dest_buf.subspan(row * dest_pitch).data();
+    uint8_t* dest_scan =
+        dest_buf.subspan(Fx2DSizeOrDie(row, dest_pitch)).data();
     const uint8_t* src_scan =
         pSrcBitmap->GetScanline(src_top + row).subspan(src_left * comps).data();
     for (int col = 0; col < width; ++col) {