| diff --git a/third_party/agg23/agg_rasterizer_scanline_aa.cpp b/third_party/agg23/agg_rasterizer_scanline_aa.cpp | 
 | index 46379f6..c6b3f01 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) { |