| Index: third_party/agg23/0003-ubsan-render-line-error.patch
|
| diff --git a/third_party/agg23/0003-ubsan-render-line-error.patch b/third_party/agg23/0003-ubsan-render-line-error.patch
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7bd3b70424d7174dc8e23224954bdaa4128740c3
|
| --- /dev/null
|
| +++ b/third_party/agg23/0003-ubsan-render-line-error.patch
|
| @@ -0,0 +1,73 @@
|
| +diff --git a/third_party/agg23/agg_rasterizer_scanline_aa.cpp b/third_party/agg23/agg_rasterizer_scanline_aa.cpp
|
| +index 46379f6..c6b3f01 100644
|
| +--- a/third_party/agg23/agg_rasterizer_scanline_aa.cpp
|
| ++++ b/third_party/agg23/agg_rasterizer_scanline_aa.cpp
|
| +@@ -48,6 +48,7 @@
|
| + //----------------------------------------------------------------------------
|
| + #include <limits.h>
|
| + #include "agg_rasterizer_scanline_aa.h"
|
| ++#include "third_party/base/numerics/safe_math.h"
|
| + namespace agg
|
| + {
|
| + AGG_INLINE void cell_aa::set_cover(int c, int a)
|
| +@@ -237,7 +238,7 @@ void outline_aa::render_line(int x1, int y1, int x2, int y2)
|
| + int fy1 = y1 & poly_base_mask;
|
| + int fy2 = y2 & poly_base_mask;
|
| + int x_from, x_to;
|
| +- int p, rem, mod, lift, delta, first, incr;
|
| ++ int rem, mod, lift, delta, first, incr;
|
| + if(ey1 == ey2) {
|
| + render_hline(ey1, x1, fy1, x2, fy2);
|
| + return;
|
| +@@ -268,16 +269,22 @@ void outline_aa::render_line(int x1, int y1, int x2, int y2)
|
| + m_cur_cell.add_cover(delta, two_fx * delta);
|
| + return;
|
| + }
|
| +- p = (poly_base_size - fy1) * dx;
|
| ++ pdfium::base::CheckedNumeric<int> safeP = poly_base_size - fy1;
|
| ++ safeP *= dx;
|
| ++ if (!safeP.IsValid())
|
| ++ return;
|
| + first = poly_base_size;
|
| + if(dy < 0) {
|
| +- p = fy1 * dx;
|
| +- first = 0;
|
| +- incr = -1;
|
| +- dy = -dy;
|
| ++ safeP = fy1;
|
| ++ safeP *= dx;
|
| ++ if (!safeP.IsValid())
|
| ++ return;
|
| ++ first = 0;
|
| ++ incr = -1;
|
| ++ dy = -dy;
|
| + }
|
| +- delta = p / dy;
|
| +- mod = p % dy;
|
| ++ delta = safeP.ValueOrDie() / dy;
|
| ++ mod = safeP.ValueOrDie() % dy;
|
| + if(mod < 0) {
|
| + delta--;
|
| + mod += dy;
|
| +@@ -287,12 +294,15 @@ void outline_aa::render_line(int x1, int y1, int x2, int y2)
|
| + ey1 += incr;
|
| + set_cur_cell(x_from >> poly_base_shift, ey1);
|
| + if(ey1 != ey2) {
|
| +- p = poly_base_size * dx;
|
| +- lift = p / dy;
|
| +- rem = p % dy;
|
| +- if(rem < 0) {
|
| +- lift--;
|
| +- rem += dy;
|
| ++ safeP = static_cast<int>(poly_base_size);
|
| ++ safeP *= dx;
|
| ++ if (!safeP.IsValid())
|
| ++ return;
|
| ++ lift = safeP.ValueOrDie() / dy;
|
| ++ rem = safeP.ValueOrDie() % dy;
|
| ++ if (rem < 0) {
|
| ++ lift--;
|
| ++ rem += dy;
|
| + }
|
| + mod -= dy;
|
| + while(ey1 != ey2) {
|
|
|