The default pthread stack size of bionic is 1M. Use malloc to avoid
stack overflow.

Signed-off-by: Jianan Huang <huangjia...@xiaomi.com>
---
 lib/compress.c | 31 +++++++++++++++++++++----------
 1 file changed, 21 insertions(+), 10 deletions(-)

diff --git a/lib/compress.c b/lib/compress.c
index cbd4620..47ba662 100644
--- a/lib/compress.c
+++ b/lib/compress.c
@@ -451,31 +451,37 @@ static int z_erofs_fill_inline_data(struct erofs_inode 
*inode, void *data,
        return len;
 }
 
-static void tryrecompress_trailing(struct z_erofs_compress_sctx *ctx,
-                                  struct erofs_compress *ec,
-                                  void *in, unsigned int *insize,
-                                  void *out, unsigned int *compressedsize)
+static int tryrecompress_trailing(struct z_erofs_compress_sctx *ctx,
+                                 struct erofs_compress *ec,
+                                 void *in, unsigned int *insize,
+                                 void *out, unsigned int *compressedsize)
 {
        struct erofs_sb_info *sbi = ctx->ictx->inode->sbi;
-       char tmp[Z_EROFS_PCLUSTER_MAX_SIZE];
+       char *tmp;
        unsigned int count;
        int ret = *compressedsize;
 
+       tmp = malloc(Z_EROFS_PCLUSTER_MAX_SIZE);
+       if (!tmp)
+               return -ENOMEM;
+
        /* no need to recompress */
        if (!(ret & (erofs_blksiz(sbi) - 1)))
-               return;
+               return 0;
 
        count = *insize;
        ret = erofs_compress_destsize(ec, in, &count, (void *)tmp,
                                      rounddown(ret, erofs_blksiz(sbi)));
        if (ret <= 0 || ret + (*insize - count) >=
                        roundup(*compressedsize, erofs_blksiz(sbi)))
-               return;
+               return 0;
 
        /* replace the original compressed data if any gain */
        memcpy(out, tmp, ret);
        *insize = count;
        *compressedsize = ret;
+
+       return 0;
 }
 
 static bool z_erofs_fixup_deduped_fragment(struct z_erofs_compress_sctx *ctx,
@@ -631,9 +637,14 @@ frag_packing:
                        goto fix_dedupedfrag;
                }
 
-               if (may_inline && len == e->length)
-                       tryrecompress_trailing(ctx, h, ctx->queue + ctx->head,
-                                       &e->length, dst, &compressedsize);
+               if (may_inline && len == e->length) {
+                       ret = tryrecompress_trailing(ctx, h,
+                                                    ctx->queue + ctx->head,
+                                                    &e->length, dst,
+                                                    &compressedsize);
+                       if (ret)
+                               return ret;
+               }
 
                e->compressedblks = BLK_ROUND_UP(sbi, compressedsize);
                DBG_BUGON(e->compressedblks * blksz >= e->length);
-- 
2.43.0

Reply via email to