mirror of
https://github.com/cuberite/libdeflate.git
synced 2025-08-04 02:06:31 -04:00
programs/gunzip: allocate at least one byte for decompressed data
libdeflate's 'gunzip' program fails if the uncompressed file size is a nonzero multiple of 4 GiB because then the ISIZE field in the gzip file is 0, so gunzip allocates no space for the decompressed data. Then when libdeflate returns LIBDEFLATE_INSUFFICIENT_SPACE, gunzip doubles the buffer size which stays 0, causing it to report "file corrupt or too large to be processed by this program". While neither libdeflate nor its 'gunzip' program is designed for single gzip streams this large anyway, this particular bug can easily be fixed by always allocating at least one byte for the decompressed data.
This commit is contained in:
parent
bc40841abf
commit
e90463fb04
@ -200,7 +200,16 @@ do_decompress(struct libdeflate_decompressor *decompressor,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Use the ISIZE field as a hint for the decompressed data size. It may
|
||||||
|
* need to be increased later, however, because the file may contain
|
||||||
|
* multiple gzip members and the particular ISIZE we happen to use may
|
||||||
|
* not be the largest; or the real size may be >= 4 GiB, causing ISIZE
|
||||||
|
* to overflow. In any case, make sure to allocate at least one byte.
|
||||||
|
*/
|
||||||
uncompressed_size = load_u32_gzip(&compressed_data[compressed_size - 4]);
|
uncompressed_size = load_u32_gzip(&compressed_data[compressed_size - 4]);
|
||||||
|
if (uncompressed_size == 0)
|
||||||
|
uncompressed_size = 1;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (uncompressed_data == NULL) {
|
if (uncompressed_data == NULL) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user