summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/fpdfapi/render/fpdf_render_loadimage_embeddertest.cpp2
-rw-r--r--core/fxcrt/fx_safe_types.h1
-rw-r--r--core/fxge/dib/cfx_imagestretcher.cpp21
3 files changed, 18 insertions, 6 deletions
diff --git a/core/fpdfapi/render/fpdf_render_loadimage_embeddertest.cpp b/core/fpdfapi/render/fpdf_render_loadimage_embeddertest.cpp
index 48d7ea3399..5103d787bd 100644
--- a/core/fpdfapi/render/fpdf_render_loadimage_embeddertest.cpp
+++ b/core/fpdfapi/render/fpdf_render_loadimage_embeddertest.cpp
@@ -17,7 +17,7 @@ TEST_F(FPDFRenderLoadImageEmbeddertest, Bug_554151) {
FPDF_PAGE page = LoadPage(0);
ASSERT_TRUE(page);
ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
- CompareBitmap(bitmap.get(), 612, 792, "a14d7ee573c1b2456d7bf6b7762823cf");
+ CompareBitmap(bitmap.get(), 612, 792, "1940568c9ba33bac5d0b1ee9558c76b3");
UnloadPage(page);
}
diff --git a/core/fxcrt/fx_safe_types.h b/core/fxcrt/fx_safe_types.h
index 51eb89cf76..046a98479e 100644
--- a/core/fxcrt/fx_safe_types.h
+++ b/core/fxcrt/fx_safe_types.h
@@ -12,6 +12,7 @@
typedef pdfium::base::CheckedNumeric<uint32_t> FX_SAFE_UINT32;
typedef pdfium::base::CheckedNumeric<int32_t> FX_SAFE_INT32;
+typedef pdfium::base::CheckedNumeric<int64_t> FX_SAFE_INT64;
typedef pdfium::base::CheckedNumeric<size_t> FX_SAFE_SIZE_T;
typedef pdfium::base::CheckedNumeric<FX_FILESIZE> FX_SAFE_FILESIZE;
diff --git a/core/fxge/dib/cfx_imagestretcher.cpp b/core/fxge/dib/cfx_imagestretcher.cpp
index 9d8e290b43..1c54e3fdd0 100644
--- a/core/fxge/dib/cfx_imagestretcher.cpp
+++ b/core/fxge/dib/cfx_imagestretcher.cpp
@@ -180,17 +180,28 @@ bool CFX_ImageStretcher::ContinueQuickStretch(PauseIndicatorIface* pPause) {
int src_height = m_pSource->GetHeight();
for (; m_LineIndex < result_height; ++m_LineIndex) {
int dest_y;
- int src_y;
+ FX_SAFE_INT64 calc_buf;
if (m_bFlipY) {
dest_y = result_height - m_LineIndex - 1;
- src_y = (m_DestHeight - (dest_y + m_ClipRect.top) - 1) * src_height /
- m_DestHeight;
+ calc_buf = m_DestHeight;
+ calc_buf -= dest_y;
+ calc_buf -= m_ClipRect.top;
+ calc_buf -= 1;
+ calc_buf *= src_height;
+ calc_buf /= m_DestHeight;
} else {
dest_y = m_LineIndex;
- src_y = (dest_y + m_ClipRect.top) * src_height / m_DestHeight;
+ calc_buf = dest_y;
+ calc_buf += m_ClipRect.top;
+ calc_buf *= src_height;
+ calc_buf /= m_DestHeight;
}
- src_y = pdfium::clamp(src_y, 0, src_height - 1);
+ int src_y;
+ if (!calc_buf.AssignIfValid(&src_y))
+ return false;
+
+ src_y = pdfium::clamp(src_y, 0, src_height - 1);
if (m_pSource->SkipToScanline(src_y, pPause))
return true;