xref: /aosp_15_r20/external/pdfium/third_party/agg23/0014-ubsan-render-line.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 d2b6a46e4..2f19a1816 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@@ -227,10 +227,27 @@ AGG_INLINE void outline_aa::render_hline(int ey, int x1, int y1, int x2, int y2)
6*3ac0a46fSAndroid Build Coastguard Worker void outline_aa::render_line(int x1, int y1, int x2, int y2)
7*3ac0a46fSAndroid Build Coastguard Worker {
8*3ac0a46fSAndroid Build Coastguard Worker     enum dx_limit_e { dx_limit = 16384 << poly_base_shift };
9*3ac0a46fSAndroid Build Coastguard Worker-    int dx = x2 - x1;
10*3ac0a46fSAndroid Build Coastguard Worker+    pdfium::base::CheckedNumeric<int> safe_dx = x2;
11*3ac0a46fSAndroid Build Coastguard Worker+    safe_dx -= x1;
12*3ac0a46fSAndroid Build Coastguard Worker+    if (!safe_dx.IsValid())
13*3ac0a46fSAndroid Build Coastguard Worker+        return;
14*3ac0a46fSAndroid Build Coastguard Worker+
15*3ac0a46fSAndroid Build Coastguard Worker+    int dx = safe_dx.ValueOrDie();
16*3ac0a46fSAndroid Build Coastguard Worker     if(dx >= dx_limit || dx <= -dx_limit) {
17*3ac0a46fSAndroid Build Coastguard Worker-        int cx = (x1 + x2) >> 1;
18*3ac0a46fSAndroid Build Coastguard Worker-        int cy = (y1 + y2) >> 1;
19*3ac0a46fSAndroid Build Coastguard Worker+        pdfium::base::CheckedNumeric<int> safe_cx = x1;
20*3ac0a46fSAndroid Build Coastguard Worker+        safe_cx += x2;
21*3ac0a46fSAndroid Build Coastguard Worker+        safe_cx /= 2;
22*3ac0a46fSAndroid Build Coastguard Worker+        if (!safe_cx.IsValid())
23*3ac0a46fSAndroid Build Coastguard Worker+            return;
24*3ac0a46fSAndroid Build Coastguard Worker+
25*3ac0a46fSAndroid Build Coastguard Worker+        pdfium::base::CheckedNumeric<int> safe_cy = y1;
26*3ac0a46fSAndroid Build Coastguard Worker+        safe_cy += y2;
27*3ac0a46fSAndroid Build Coastguard Worker+        safe_cy /= 2;
28*3ac0a46fSAndroid Build Coastguard Worker+        if (!safe_cy.IsValid())
29*3ac0a46fSAndroid Build Coastguard Worker+            return;
30*3ac0a46fSAndroid Build Coastguard Worker+
31*3ac0a46fSAndroid Build Coastguard Worker+        int cx = safe_cx.ValueOrDie();
32*3ac0a46fSAndroid Build Coastguard Worker+        int cy = safe_cy.ValueOrDie();
33*3ac0a46fSAndroid Build Coastguard Worker         render_line(x1, y1, cx, cy);
34*3ac0a46fSAndroid Build Coastguard Worker         render_line(cx, cy, x2, y2);
35*3ac0a46fSAndroid Build Coastguard Worker     }
36