mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
lib: decompress_bunzip2: fix integer overflow in run-length decoding
The RUNA/RUNB decoder in get_next_block() accumulates a run length into
the signed int t with no bound. runPos doubles per symbol, so t grows as
at least 2^n-1 and reaches INT_MAX after 31 RUNA symbols. The guard that
follows, dbufCount+t >= dbufSize, is itself a signed addition, and as the
kernel builds with -fno-strict-overflow it wraps negative once dbufCount
is nonzero, so the guard is skipped. while (t--) dbuf[dbufCount++] = uc
then writes INT_MAX entries into a buffer holding at most 900000. One
literal symbol ahead of the run is enough to make dbufCount nonzero.
Bound t to the block size as it is accumulated. t only grows within a
run, so the value tested never exceeds the final run length; any stream
that decodes today satisfies dbufCount+t < dbufSize at the flush, hence t
< dbufSize throughout, and no such stream is rejected. Because t grows as
at least 2^n-1 the bound trips by the 20th symbol, leaving runPos at most
2^19, so the following runPos <<= 1 cannot overflow either.
Link: https://lore.kernel.org/AS8P251MB00010FE5E38D253CF98A652AC8B92@AS8P251MB0001.EURP251.PROD.OUTLOOK.COM
Fixes: bc22c17e12 ("bzip2/lzma: library support for gzip, bzip2 and lzma decompression")
Signed-off-by: Aamir Ahmed <elb12345@hotmail.co.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Assisted-by: LLM
Cc: Alain Knaff <alain@knaff.lu>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: <stable@vger.kernel.org>
This commit is contained in:
parent
68d956e9e2
commit
b822ad8d70
|
|
@ -428,6 +428,10 @@ static int INIT get_next_block(struct bunzip_data *bd)
|
|||
t += (runPos << nextSym);
|
||||
/* +runPos if RUNA; +2*runPos if RUNB */
|
||||
|
||||
/* Bound the run so t and runPos cannot overflow. */
|
||||
if (t >= dbufSize)
|
||||
return RETVAL_DATA_ERROR;
|
||||
|
||||
runPos <<= 1;
|
||||
continue;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user