| Index: pdf/pdfium/pdfium_page.cc
|
| diff --git a/pdf/pdfium/pdfium_page.cc b/pdf/pdfium/pdfium_page.cc
|
| index bd45861abe2060e4db44f7aef5a33720bb06df40..45724eedcd0e5653e7cdab3f6004181324bca07f 100644
|
| --- a/pdf/pdfium/pdfium_page.cc
|
| +++ b/pdf/pdfium/pdfium_page.cc
|
| @@ -12,6 +12,7 @@
|
| #include <utility>
|
|
|
| #include "base/logging.h"
|
| +#include "base/numerics/safe_math.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/strings/string_util.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| @@ -461,21 +462,29 @@ pp::Rect PDFiumPage::PageToScreen(const pp::Point& offset,
|
| if (!available_)
|
| return pp::Rect();
|
|
|
| - int new_left, new_top, new_right, new_bottom;
|
| - FPDF_PageToDevice(
|
| - page_,
|
| - static_cast<int>((rect_.x() - offset.x()) * zoom),
|
| - static_cast<int>((rect_.y() - offset.y()) * zoom),
|
| - static_cast<int>(ceil(rect_.width() * zoom)),
|
| - static_cast<int>(ceil(rect_.height() * zoom)),
|
| - rotation, left, top, &new_left, &new_top);
|
| - FPDF_PageToDevice(
|
| - page_,
|
| - static_cast<int>((rect_.x() - offset.x()) * zoom),
|
| - static_cast<int>((rect_.y() - offset.y()) * zoom),
|
| - static_cast<int>(ceil(rect_.width() * zoom)),
|
| - static_cast<int>(ceil(rect_.height() * zoom)),
|
| - rotation, right, bottom, &new_right, &new_bottom);
|
| + double start_x = (rect_.x() - offset.x()) * zoom;
|
| + double start_y = (rect_.y() - offset.y()) * zoom;
|
| + double size_x = rect_.width() * zoom;
|
| + double size_y = rect_.height() * zoom;
|
| + if (!base::IsValueInRangeForNumericType<int>(start_x) ||
|
| + !base::IsValueInRangeForNumericType<int>(start_y) ||
|
| + !base::IsValueInRangeForNumericType<int>(size_x) ||
|
| + !base::IsValueInRangeForNumericType<int>(size_y)) {
|
| + return pp::Rect();
|
| + }
|
| +
|
| + int new_left;
|
| + int new_top;
|
| + int new_right;
|
| + int new_bottom;
|
| + FPDF_PageToDevice(page_, static_cast<int>(start_x), static_cast<int>(start_y),
|
| + static_cast<int>(ceil(size_x)),
|
| + static_cast<int>(ceil(size_y)), rotation, left, top,
|
| + &new_left, &new_top);
|
| + FPDF_PageToDevice(page_, static_cast<int>(start_x), static_cast<int>(start_y),
|
| + static_cast<int>(ceil(size_x)),
|
| + static_cast<int>(ceil(size_y)), rotation, right, bottom,
|
| + &new_right, &new_bottom);
|
|
|
| // If the PDF is rotated, the horizontal/vertical coordinates could be
|
| // flipped. See
|
| @@ -485,8 +494,17 @@ pp::Rect PDFiumPage::PageToScreen(const pp::Point& offset,
|
| if (new_bottom < new_top)
|
| std::swap(new_bottom, new_top);
|
|
|
| - return pp::Rect(
|
| - new_left, new_top, new_right - new_left + 1, new_bottom - new_top + 1);
|
| + base::CheckedNumeric<int32_t> new_size_x = new_right;
|
| + new_size_x -= new_left;
|
| + new_size_x += 1;
|
| + base::CheckedNumeric<int32_t> new_size_y = new_bottom;
|
| + new_size_y -= new_top;
|
| + new_size_y += 1;
|
| + if (!new_size_x.IsValid() || !new_size_y.IsValid())
|
| + return pp::Rect();
|
| +
|
| + return pp::Rect(new_left, new_top, new_size_x.ValueOrDie(),
|
| + new_size_y.ValueOrDie());
|
| }
|
|
|
| PDFiumPage::ScopedLoadCounter::ScopedLoadCounter(PDFiumPage* page)
|
|
|