[PATCH 2/2] erofs-utils: lib: switch to on-heap fitblk_buffer for libdeflate
Gao Xiang
hsiangkao at linux.alibaba.com
Thu Jul 3 15:34:46 AEST 2025
- Allocating VLAs on the stack (or using alloca()) for large sizes
could exceed the stack limit;
- It's easier to isolate these buffers on the heap for code sanitizers
to detect potential bugs.
Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
---
lib/compressor_libdeflate.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/lib/compressor_libdeflate.c b/lib/compressor_libdeflate.c
index f6a7de9d..186da87c 100644
--- a/lib/compressor_libdeflate.c
+++ b/lib/compressor_libdeflate.c
@@ -9,6 +9,8 @@
struct erofs_libdeflate_context {
struct libdeflate_compressor *strm;
+ u8 *fitblk_buffer;
+ unsigned int fitblk_bufsiz;
size_t last_uncompressed_size;
};
@@ -38,7 +40,15 @@ static int libdeflate_compress_destsize(const struct erofs_compress *c,
size_t l_csize = 0;
size_t r = *srcsize + 1; /* smallest input that doesn't fit so far */
size_t m;
- u8 tmpbuf[dstsize + 9];
+
+ if (dstsize + 9 > ctx->fitblk_bufsiz) {
+ u8 *buf = realloc(ctx->fitblk_buffer, dstsize + 9);
+
+ if (!buf)
+ return -ENOMEM;
+ ctx->fitblk_bufsiz = dstsize + 9;
+ ctx->fitblk_buffer = buf;
+ }
if (ctx->last_uncompressed_size)
m = ctx->last_uncompressed_size * 15 / 16;
@@ -51,11 +61,12 @@ static int libdeflate_compress_destsize(const struct erofs_compress *c,
m = min(m, r - 1);
csize = libdeflate_deflate_compress(ctx->strm, src, m,
- tmpbuf, dstsize + 9);
+ ctx->fitblk_buffer,
+ dstsize + 9);
/*printf("Tried %zu => %zu\n", m, csize);*/
if (csize > 0 && csize <= dstsize) {
/* Fits */
- memcpy(dst, tmpbuf, csize);
+ memcpy(dst, ctx->fitblk_buffer, csize);
l = m;
l_csize = csize;
if (r <= l + 1 || csize +
@@ -102,6 +113,7 @@ static int compressor_libdeflate_exit(struct erofs_compress *c)
if (!ctx)
return -EINVAL;
libdeflate_free_compressor(ctx->strm);
+ free(ctx->fitblk_buffer);
free(ctx);
return 0;
}
--
2.43.5
More information about the Linux-erofs
mailing list