util: Heap-allocate 256K zlib buffer
The disk cache code tries to allocate a 256 Kbyte buffer on the stack. Since musl only gives 80 Kbyte of stack space per thread, this causes a trap. See https://wiki.musl-libc.org/functional-differences-from-glibc.html#Thread-stack-size (In musl-1.1.21 the default stack size has increased to 128K) [mattst88]: Original author unknown, but I think this is small enough that it is not copyrightable. Reviewed-by: Matt Turner <mattst88@gmail.com> Reviewed-by: Eric Anholt <eric@anholt.net> Reviewed-by: Eric Engestrom <eric.engestrom@intel.com>
This commit is contained in:
@@ -732,7 +732,7 @@ static size_t
|
|||||||
deflate_and_write_to_disk(const void *in_data, size_t in_data_size, int dest,
|
deflate_and_write_to_disk(const void *in_data, size_t in_data_size, int dest,
|
||||||
const char *filename)
|
const char *filename)
|
||||||
{
|
{
|
||||||
unsigned char out[BUFSIZE];
|
unsigned char *out;
|
||||||
|
|
||||||
/* allocate deflate state */
|
/* allocate deflate state */
|
||||||
z_stream strm;
|
z_stream strm;
|
||||||
@@ -749,6 +749,11 @@ deflate_and_write_to_disk(const void *in_data, size_t in_data_size, int dest,
|
|||||||
/* compress until end of in_data */
|
/* compress until end of in_data */
|
||||||
size_t compressed_size = 0;
|
size_t compressed_size = 0;
|
||||||
int flush;
|
int flush;
|
||||||
|
|
||||||
|
out = malloc(BUFSIZE * sizeof(unsigned char));
|
||||||
|
if (out == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
int remaining = in_data_size - BUFSIZE;
|
int remaining = in_data_size - BUFSIZE;
|
||||||
flush = remaining > 0 ? Z_NO_FLUSH : Z_FINISH;
|
flush = remaining > 0 ? Z_NO_FLUSH : Z_FINISH;
|
||||||
@@ -770,6 +775,7 @@ deflate_and_write_to_disk(const void *in_data, size_t in_data_size, int dest,
|
|||||||
ssize_t written = write_all(dest, out, have);
|
ssize_t written = write_all(dest, out, have);
|
||||||
if (written == -1) {
|
if (written == -1) {
|
||||||
(void)deflateEnd(&strm);
|
(void)deflateEnd(&strm);
|
||||||
|
free(out);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} while (strm.avail_out == 0);
|
} while (strm.avail_out == 0);
|
||||||
@@ -784,6 +790,7 @@ deflate_and_write_to_disk(const void *in_data, size_t in_data_size, int dest,
|
|||||||
|
|
||||||
/* clean up and return */
|
/* clean up and return */
|
||||||
(void)deflateEnd(&strm);
|
(void)deflateEnd(&strm);
|
||||||
|
free(out);
|
||||||
return compressed_size;
|
return compressed_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user