mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-21 12:25:27 +00:00
lzma: correctly bounds-check output buffer
The output buffer size must be correctly passed to the lzma decoder or there is a risk of overflowing memory during decompression. Switching to the LZMA_FINISH_END mode means nothing is left in an unknown state once the buffer becomes full. Signed-off-by: Kees Cook <keescook@chromium.org> Acked-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
b75650d84d
commit
afca294289
1 changed files with 6 additions and 2 deletions
|
@ -97,15 +97,19 @@ int lzmaBuffToBuffDecompress (unsigned char *outStream, SizeT *uncompressedSize,
|
||||||
g_Alloc.Alloc = SzAlloc;
|
g_Alloc.Alloc = SzAlloc;
|
||||||
g_Alloc.Free = SzFree;
|
g_Alloc.Free = SzFree;
|
||||||
|
|
||||||
|
/* Short-circuit early if we know the buffer can't hold the results. */
|
||||||
|
if (outSizeFull != (SizeT)-1 && *uncompressedSize < outSizeFull)
|
||||||
|
return SZ_ERROR_OUTPUT_EOF;
|
||||||
|
|
||||||
/* Decompress */
|
/* Decompress */
|
||||||
outProcessed = outSizeFull;
|
outProcessed = *uncompressedSize;
|
||||||
|
|
||||||
WATCHDOG_RESET();
|
WATCHDOG_RESET();
|
||||||
|
|
||||||
res = LzmaDecode(
|
res = LzmaDecode(
|
||||||
outStream, &outProcessed,
|
outStream, &outProcessed,
|
||||||
inStream + LZMA_DATA_OFFSET, &compressedSize,
|
inStream + LZMA_DATA_OFFSET, &compressedSize,
|
||||||
inStream, LZMA_PROPS_SIZE, LZMA_FINISH_ANY, &state, &g_Alloc);
|
inStream, LZMA_PROPS_SIZE, LZMA_FINISH_END, &state, &g_Alloc);
|
||||||
*uncompressedSize = outProcessed;
|
*uncompressedSize = outProcessed;
|
||||||
if (res != SZ_OK) {
|
if (res != SZ_OK) {
|
||||||
return res;
|
return res;
|
||||||
|
|
Loading…
Add table
Reference in a new issue