Fix a bug where invalid LZW data could cause out of bounds access.
diff --git a/pigz.c b/pigz.c
index 483ef94..e4db2c2 100644
--- a/pigz.c
+++ b/pigz.c
@@ -3252,15 +3252,18 @@
machine instruction!) */
{
unsigned rem = ((g.in_tot - g.in_left) - mark) % bits;
- if (rem)
+ if (rem) {
rem = bits - rem;
- while (rem > g.in_left) {
- rem -= g.in_left;
- if (load() == 0)
- break;
+ if (NOMORE())
+ break; /* end of compressed data */
+ while (rem > g.in_left) {
+ rem -= g.in_left;
+ if (load() == 0)
+ throw(EDOM, "%s: lzw premature end", g.inf);
+ }
+ g.in_left -= rem;
+ g.in_next += rem;
}
- g.in_left -= rem;
- g.in_next += rem;
}
buf = 0;
left = 0;
@@ -3294,15 +3297,16 @@
/* flush unused input bits and bytes to next 8*bits bit boundary */
{
unsigned rem = ((g.in_tot - g.in_left) - mark) % bits;
- if (rem)
+ if (rem) {
rem = bits - rem;
- while (rem > g.in_left) {
- rem -= g.in_left;
- if (load() == 0)
- break;
+ while (rem > g.in_left) {
+ rem -= g.in_left;
+ if (load() == 0)
+ throw(EDOM, "%s: lzw premature end", g.inf);
+ }
+ g.in_left -= rem;
+ g.in_next += rem;
}
- g.in_left -= rem;
- g.in_next += rem;
}
buf = 0;
left = 0;