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