diff options
author | Jory Pratt <[email protected]> | 2019-06-10 11:48:02 -0700 |
---|---|---|
committer | Matt Turner <[email protected]> | 2019-06-19 12:16:18 -0700 |
commit | fd7b7f14d857f96cf3b2e9d8405dbbfa30dc261a (patch) | |
tree | 586e9ff10505421f12f2bae3fb661da9902bb796 | |
parent | 9c19d07b1cdcd22ced0f4e1c147e496b6ff5cf23 (diff) |
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 <[email protected]>
Reviewed-by: Eric Anholt <[email protected]>
Reviewed-by: Eric Engestrom <[email protected]>
-rw-r--r-- | src/util/disk_cache.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c index 9977c385de1..bc3becfe535 100644 --- a/src/util/disk_cache.c +++ b/src/util/disk_cache.c @@ -732,7 +732,7 @@ static size_t deflate_and_write_to_disk(const void *in_data, size_t in_data_size, int dest, const char *filename) { - unsigned char out[BUFSIZE]; + unsigned char *out; /* allocate deflate state */ 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 */ size_t compressed_size = 0; int flush; + + out = malloc(BUFSIZE * sizeof(unsigned char)); + if (out == NULL) + return 0; + do { int remaining = in_data_size - BUFSIZE; 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); if (written == -1) { (void)deflateEnd(&strm); + free(out); return 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 */ (void)deflateEnd(&strm); + free(out); return compressed_size; } |