Index: third_party/agg23/agg_rasterizer_scanline_aa.cpp |
diff --git a/third_party/agg23/agg_rasterizer_scanline_aa.cpp b/third_party/agg23/agg_rasterizer_scanline_aa.cpp |
index 46379f6dfdaafe7865e1ce3b9bd5077d7fe6783c..c6b3f013a03d011ebe7b3cdfdf65ed7a7c44986c 100644 |
--- a/third_party/agg23/agg_rasterizer_scanline_aa.cpp |
+++ b/third_party/agg23/agg_rasterizer_scanline_aa.cpp |
@@ -48,6 +48,7 @@ |
//---------------------------------------------------------------------------- |
#include <limits.h> |
#include "agg_rasterizer_scanline_aa.h" |
+#include "third_party/base/numerics/safe_math.h" |
namespace agg |
{ |
AGG_INLINE void cell_aa::set_cover(int c, int a) |
@@ -237,7 +238,7 @@ void outline_aa::render_line(int x1, int y1, int x2, int y2) |
int fy1 = y1 & poly_base_mask; |
int fy2 = y2 & poly_base_mask; |
int x_from, x_to; |
- int p, rem, mod, lift, delta, first, incr; |
+ int rem, mod, lift, delta, first, incr; |
if(ey1 == ey2) { |
render_hline(ey1, x1, fy1, x2, fy2); |
return; |
@@ -268,16 +269,22 @@ void outline_aa::render_line(int x1, int y1, int x2, int y2) |
m_cur_cell.add_cover(delta, two_fx * delta); |
return; |
} |
- p = (poly_base_size - fy1) * dx; |
+ pdfium::base::CheckedNumeric<int> safeP = poly_base_size - fy1; |
+ safeP *= dx; |
+ if (!safeP.IsValid()) |
+ return; |
first = poly_base_size; |
if(dy < 0) { |
- p = fy1 * dx; |
- first = 0; |
- incr = -1; |
- dy = -dy; |
+ safeP = fy1; |
+ safeP *= dx; |
+ if (!safeP.IsValid()) |
+ return; |
+ first = 0; |
+ incr = -1; |
+ dy = -dy; |
} |
- delta = p / dy; |
- mod = p % dy; |
+ delta = safeP.ValueOrDie() / dy; |
+ mod = safeP.ValueOrDie() % dy; |
if(mod < 0) { |
delta--; |
mod += dy; |
@@ -287,12 +294,15 @@ void outline_aa::render_line(int x1, int y1, int x2, int y2) |
ey1 += incr; |
set_cur_cell(x_from >> poly_base_shift, ey1); |
if(ey1 != ey2) { |
- p = poly_base_size * dx; |
- lift = p / dy; |
- rem = p % dy; |
- if(rem < 0) { |
- lift--; |
- rem += dy; |
+ safeP = static_cast<int>(poly_base_size); |
+ safeP *= dx; |
+ if (!safeP.IsValid()) |
+ return; |
+ lift = safeP.ValueOrDie() / dy; |
+ rem = safeP.ValueOrDie() % dy; |
+ if (rem < 0) { |
+ lift--; |
+ rem += dy; |
} |
mod -= dy; |
while(ey1 != ey2) { |