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