Home | History | Annotate | Download | only in agg23
      1 diff --git a/third_party/agg23/agg_rasterizer_scanline_aa.cpp b/third_party/agg23/agg_rasterizer_scanline_aa.cpp
      2 index 46379f6..c6b3f01 100644
      3 --- a/third_party/agg23/agg_rasterizer_scanline_aa.cpp
      4 +++ b/third_party/agg23/agg_rasterizer_scanline_aa.cpp
      5 @@ -48,6 +48,7 @@
      6  //----------------------------------------------------------------------------
      7  #include <limits.h>
      8  #include "agg_rasterizer_scanline_aa.h"
      9 +#include "third_party/base/numerics/safe_math.h"
     10  namespace agg
     11  {
     12  AGG_INLINE void cell_aa::set_cover(int c, int a)
     13 @@ -237,7 +238,7 @@ void outline_aa::render_line(int x1, int y1, int x2, int y2)
     14      int fy1 = y1 & poly_base_mask;
     15      int fy2 = y2 & poly_base_mask;
     16      int x_from, x_to;
     17 -    int p, rem, mod, lift, delta, first, incr;
     18 +    int rem, mod, lift, delta, first, incr;
     19      if(ey1 == ey2) {
     20          render_hline(ey1, x1, fy1, x2, fy2);
     21          return;
     22 @@ -268,16 +269,22 @@ void outline_aa::render_line(int x1, int y1, int x2, int y2)
     23          m_cur_cell.add_cover(delta, two_fx * delta);
     24          return;
     25      }
     26 -    p     = (poly_base_size - fy1) * dx;
     27 +    pdfium::base::CheckedNumeric<int> safeP = poly_base_size - fy1;
     28 +    safeP *= dx;
     29 +    if (!safeP.IsValid())
     30 +      return;
     31      first = poly_base_size;
     32      if(dy < 0) {
     33 -        p     = fy1 * dx;
     34 -        first = 0;
     35 -        incr  = -1;
     36 -        dy    = -dy;
     37 +      safeP = fy1;
     38 +      safeP *= dx;
     39 +      if (!safeP.IsValid())
     40 +        return;
     41 +      first = 0;
     42 +      incr = -1;
     43 +      dy = -dy;
     44      }
     45 -    delta = p / dy;
     46 -    mod   = p % dy;
     47 +    delta = safeP.ValueOrDie() / dy;
     48 +    mod = safeP.ValueOrDie() % dy;
     49      if(mod < 0) {
     50          delta--;
     51          mod += dy;
     52 @@ -287,12 +294,15 @@ void outline_aa::render_line(int x1, int y1, int x2, int y2)
     53      ey1 += incr;
     54      set_cur_cell(x_from >> poly_base_shift, ey1);
     55      if(ey1 != ey2) {
     56 -        p     = poly_base_size * dx;
     57 -        lift  = p / dy;
     58 -        rem   = p % dy;
     59 -        if(rem < 0) {
     60 -            lift--;
     61 -            rem += dy;
     62 +      safeP = static_cast<int>(poly_base_size);
     63 +      safeP *= dx;
     64 +      if (!safeP.IsValid())
     65 +        return;
     66 +      lift = safeP.ValueOrDie() / dy;
     67 +      rem = safeP.ValueOrDie() % dy;
     68 +      if (rem < 0) {
     69 +        lift--;
     70 +        rem += dy;
     71          }
     72          mod -= dy;
     73          while(ey1 != ey2) {
     74