| diff --git a/third_party/agg23/agg_rasterizer_scanline_aa.cpp b/third_party/agg23/agg_rasterizer_scanline_aa.cpp | 
 | index 1fe9a0c32..9254d830d 100644 | 
 | --- a/third_party/agg23/agg_rasterizer_scanline_aa.cpp | 
 | +++ b/third_party/agg23/agg_rasterizer_scanline_aa.cpp | 
 | @@ -502,4 +502,16 @@ int rasterizer_scanline_aa::calculate_area(int cover, int shift) | 
 |      result <<= shift; | 
 |      return result; | 
 |  } | 
 | +// static | 
 | +bool rasterizer_scanline_aa::safe_add(int* op1, int op2) | 
 | +{ | 
 | +    pdfium::base::CheckedNumeric<int> safeOp1 = *op1; | 
 | +    safeOp1 += op2; | 
 | +    if(!safeOp1.IsValid()) { | 
 | +        return false; | 
 | +    } | 
 | + | 
 | +    *op1 = safeOp1.ValueOrDie(); | 
 | +    return true; | 
 | +} | 
 |  } | 
 | diff --git a/third_party/agg23/agg_rasterizer_scanline_aa.h b/third_party/agg23/agg_rasterizer_scanline_aa.h | 
 | index 281933710..eade78333 100644 | 
 | --- a/third_party/agg23/agg_rasterizer_scanline_aa.h | 
 | +++ b/third_party/agg23/agg_rasterizer_scanline_aa.h | 
 | @@ -338,14 +338,33 @@ public: | 
 |                  const cell_aa* cur_cell = *cells; | 
 |                  int x    = cur_cell->x; | 
 |                  int area = cur_cell->area; | 
 | -                cover += cur_cell->cover; | 
 | +                bool seen_area_overflow = false; | 
 | +                bool seen_cover_overflow = false; | 
 | +                if(!safe_add(&cover, cur_cell->cover)) { | 
 | +                    break; | 
 | +                } | 
 |                  while(--num_cells) { | 
 |                      cur_cell = *++cells; | 
 |                      if(cur_cell->x != x) { | 
 |                          break; | 
 |                      } | 
 | -                    area  += cur_cell->area; | 
 | -                    cover += cur_cell->cover; | 
 | +                    if(seen_area_overflow) { | 
 | +                        continue; | 
 | +                    } | 
 | +                    if(!safe_add(&area, cur_cell->area)) { | 
 | +                        seen_area_overflow = true; | 
 | +                        continue; | 
 | +                    } | 
 | +                    if(!safe_add(&cover, cur_cell->cover)) { | 
 | +                        seen_cover_overflow = true; | 
 | +                        break; | 
 | +                    } | 
 | +                } | 
 | +                if(seen_area_overflow) { | 
 | +                    continue; | 
 | +                } | 
 | +                if(seen_cover_overflow) { | 
 | +                    break; | 
 |                  } | 
 |                  if(area) { | 
 |                      unsigned alpha = calculate_alpha(calculate_area(cover, poly_base_shift + 1) - area, no_smooth); | 
 | @@ -459,6 +478,7 @@ private: | 
 |      } | 
 |  private: | 
 |      static int calculate_area(int cover, int shift); | 
 | +    static bool safe_add(int* op1, int op2); | 
 |   | 
 |      outline_aa     m_outline; | 
 |      filling_rule_e m_filling_rule; |