ref: 3f370a0ffaa5dd8b903b0ee36294529fbf0cbd1f
parent: d02b3649334e59e862b37c70d7d0fa9e086a524c
author: zeniko <zeniko@gmail.com>
date: Tue Jun 11 18:49:05 EDT 2013
Bug 694125: prevent heap underflow jbig2_decode_mmr_line checks the arguments to jbig2_set_bits since the fixes to issue 693050, however these checks still allow for the starting index to be negative which results in a write underflow; fixes 2860.pdf.asan.9.2069
--- a/jbig2_mmr.c
+++ b/jbig2_mmr.c
@@ -862,7 +862,7 @@
a2 = a1 + black_run;
if (a1 > mmr->width) a1 = mmr->width;
if (a2 > mmr->width) a2 = mmr->width;
- if (a2 < a1) return -1;
+ if (a2 < a1 || a1 < 0) return -1;
jbig2_set_bits(dst, a1, a2);
a0 = a2;
/* printf ("H %d %d\n", white_run, black_run); */
@@ -875,7 +875,7 @@
a2 = a1 + white_run;
if (a1 > mmr->width) a1 = mmr->width;
if (a2 > mmr->width) a2 = mmr->width;
- if (a1 < a0) return -1;
+ if (a1 < a0 || a0 < 0) return -1;
jbig2_set_bits(dst, a0, a1);
a0 = a2;
/* printf ("H %d %d\n", black_run, white_run); */
@@ -890,7 +890,7 @@
b2 = jbig2_find_changing_element(ref, b1, mmr->width);
if (c)
{
- if (b2 < a0) return -1;
+ if (b2 < a0 || a0 < 0) return -1;
jbig2_set_bits(dst, a0, b2);
}
a0 = b2;
@@ -903,7 +903,7 @@
b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
if (c)
{
- if (b1 < a0) return -1;
+ if (b1 < a0 || a0 < 0) return -1;
jbig2_set_bits(dst, a0, b1);
}
a0 = b1;
@@ -918,7 +918,7 @@
if (b1 + 1 > mmr->width) break;
if (c)
{
- if (b1 + 1 < a0) return -1;
+ if (b1 + 1 < a0 || a0 < 0) return -1;
jbig2_set_bits(dst, a0, b1 + 1);
}
a0 = b1 + 1;
@@ -933,7 +933,7 @@
if (b1 + 2 > mmr->width) break;
if (c)
{
- if (b1 + 2 < a0) return -1;
+ if (b1 + 2 < a0 || a0 < 0) return -1;
jbig2_set_bits(dst, a0, b1 + 2);
}
a0 = b1 + 2;
@@ -948,7 +948,7 @@
if (b1 + 3 > mmr->width) break;
if (c)
{
- if (b1 + 3 < a0) return -1;
+ if (b1 + 3 < a0 || a0 < 0) return -1;
jbig2_set_bits(dst, a0, b1 + 3);
}
a0 = b1 + 3;
@@ -963,7 +963,7 @@
if (b1 - 1 < 0) break;
if (c)
{
- if (b1 - 1 < a0) return -1;
+ if (b1 - 1 < a0 || a0 < 0) return -1;
jbig2_set_bits(dst, a0, b1 - 1);
}
a0 = b1 - 1;
@@ -978,7 +978,7 @@
if (b1 - 2 < 0) break;
if (c)
{
- if (b1 - 2 < a0) return -1;
+ if (b1 - 2 < a0 || a0 < 0) return -1;
jbig2_set_bits(dst, a0, b1 - 2);
}
a0 = b1 - 2;
@@ -993,7 +993,7 @@
if (b1 - 3 < 0) break;
if (c)
{
- if (b1 - 3 < a0) return -1;
+ if (b1 - 3 < a0 || a0 < 0) return -1;
jbig2_set_bits(dst, a0, b1 - 3);
}
a0 = b1 - 3;