xref: /aosp_15_r20/external/pdfium/third_party/agg23/0006-ubsan-sweep-scanline-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 1fe9a0c32..9254d830d 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@@ -502,4 +502,16 @@ int rasterizer_scanline_aa::calculate_area(int cover, int shift)
6*3ac0a46fSAndroid Build Coastguard Worker     result <<= shift;
7*3ac0a46fSAndroid Build Coastguard Worker     return result;
8*3ac0a46fSAndroid Build Coastguard Worker }
9*3ac0a46fSAndroid Build Coastguard Worker+// static
10*3ac0a46fSAndroid Build Coastguard Worker+bool rasterizer_scanline_aa::safe_add(int* op1, int op2)
11*3ac0a46fSAndroid Build Coastguard Worker+{
12*3ac0a46fSAndroid Build Coastguard Worker+    pdfium::base::CheckedNumeric<int> safeOp1 = *op1;
13*3ac0a46fSAndroid Build Coastguard Worker+    safeOp1 += op2;
14*3ac0a46fSAndroid Build Coastguard Worker+    if(!safeOp1.IsValid()) {
15*3ac0a46fSAndroid Build Coastguard Worker+        return false;
16*3ac0a46fSAndroid Build Coastguard Worker+    }
17*3ac0a46fSAndroid Build Coastguard Worker+
18*3ac0a46fSAndroid Build Coastguard Worker+    *op1 = safeOp1.ValueOrDie();
19*3ac0a46fSAndroid Build Coastguard Worker+    return true;
20*3ac0a46fSAndroid Build Coastguard Worker+}
21*3ac0a46fSAndroid Build Coastguard Worker }
22*3ac0a46fSAndroid Build Coastguard Workerdiff --git a/third_party/agg23/agg_rasterizer_scanline_aa.h b/third_party/agg23/agg_rasterizer_scanline_aa.h
23*3ac0a46fSAndroid Build Coastguard Workerindex 281933710..eade78333 100644
24*3ac0a46fSAndroid Build Coastguard Worker--- a/third_party/agg23/agg_rasterizer_scanline_aa.h
25*3ac0a46fSAndroid Build Coastguard Worker+++ b/third_party/agg23/agg_rasterizer_scanline_aa.h
26*3ac0a46fSAndroid Build Coastguard Worker@@ -338,14 +338,33 @@ public:
27*3ac0a46fSAndroid Build Coastguard Worker                 const cell_aa* cur_cell = *cells;
28*3ac0a46fSAndroid Build Coastguard Worker                 int x    = cur_cell->x;
29*3ac0a46fSAndroid Build Coastguard Worker                 int area = cur_cell->area;
30*3ac0a46fSAndroid Build Coastguard Worker-                cover += cur_cell->cover;
31*3ac0a46fSAndroid Build Coastguard Worker+                bool seen_area_overflow = false;
32*3ac0a46fSAndroid Build Coastguard Worker+                bool seen_cover_overflow = false;
33*3ac0a46fSAndroid Build Coastguard Worker+                if(!safe_add(&cover, cur_cell->cover)) {
34*3ac0a46fSAndroid Build Coastguard Worker+                    break;
35*3ac0a46fSAndroid Build Coastguard Worker+                }
36*3ac0a46fSAndroid Build Coastguard Worker                 while(--num_cells) {
37*3ac0a46fSAndroid Build Coastguard Worker                     cur_cell = *++cells;
38*3ac0a46fSAndroid Build Coastguard Worker                     if(cur_cell->x != x) {
39*3ac0a46fSAndroid Build Coastguard Worker                         break;
40*3ac0a46fSAndroid Build Coastguard Worker                     }
41*3ac0a46fSAndroid Build Coastguard Worker-                    area  += cur_cell->area;
42*3ac0a46fSAndroid Build Coastguard Worker-                    cover += cur_cell->cover;
43*3ac0a46fSAndroid Build Coastguard Worker+                    if(seen_area_overflow) {
44*3ac0a46fSAndroid Build Coastguard Worker+                        continue;
45*3ac0a46fSAndroid Build Coastguard Worker+                    }
46*3ac0a46fSAndroid Build Coastguard Worker+                    if(!safe_add(&area, cur_cell->area)) {
47*3ac0a46fSAndroid Build Coastguard Worker+                        seen_area_overflow = true;
48*3ac0a46fSAndroid Build Coastguard Worker+                        continue;
49*3ac0a46fSAndroid Build Coastguard Worker+                    }
50*3ac0a46fSAndroid Build Coastguard Worker+                    if(!safe_add(&cover, cur_cell->cover)) {
51*3ac0a46fSAndroid Build Coastguard Worker+                        seen_cover_overflow = true;
52*3ac0a46fSAndroid Build Coastguard Worker+                        break;
53*3ac0a46fSAndroid Build Coastguard Worker+                    }
54*3ac0a46fSAndroid Build Coastguard Worker+                }
55*3ac0a46fSAndroid Build Coastguard Worker+                if(seen_area_overflow) {
56*3ac0a46fSAndroid Build Coastguard Worker+                    continue;
57*3ac0a46fSAndroid Build Coastguard Worker+                }
58*3ac0a46fSAndroid Build Coastguard Worker+                if(seen_cover_overflow) {
59*3ac0a46fSAndroid Build Coastguard Worker+                    break;
60*3ac0a46fSAndroid Build Coastguard Worker                 }
61*3ac0a46fSAndroid Build Coastguard Worker                 if(area) {
62*3ac0a46fSAndroid Build Coastguard Worker                     unsigned alpha = calculate_alpha(calculate_area(cover, poly_base_shift + 1) - area, no_smooth);
63*3ac0a46fSAndroid Build Coastguard Worker@@ -459,6 +478,7 @@ private:
64*3ac0a46fSAndroid Build Coastguard Worker     }
65*3ac0a46fSAndroid Build Coastguard Worker private:
66*3ac0a46fSAndroid Build Coastguard Worker     static int calculate_area(int cover, int shift);
67*3ac0a46fSAndroid Build Coastguard Worker+    static bool safe_add(int* op1, int op2);
68*3ac0a46fSAndroid Build Coastguard Worker
69*3ac0a46fSAndroid Build Coastguard Worker     outline_aa     m_outline;
70*3ac0a46fSAndroid Build Coastguard Worker     filling_rule_e m_filling_rule;
71