[PATCH] erofs-utils: lib: set `bh->op` immediately for compressed buffers
Gao Xiang
hsiangkao at linux.alibaba.com
Wed Feb 18 21:58:41 AEDT 2026
This fixes the following SIGSEGV that occurs when compression fails:
in __erofs_bflush (bmgr=0x7ffff695c010, bb=0x0, abort=true) at cache.c:482
482 ret = bh->op->flush(bh, abort);
0 0x0000000000413860 in __erofs_bflush (bmgr=0x7ffff695c010, bb=0x0, abort=true) at cache.c:482
1 0x0000000000413cbe in erofs_buffer_exit (bmgr=0x7ffff695c010) at cache.c:549
2 0x0000000000414f72 in erofs_put_super (sbi=0x493270 <g_sbi>) at super.c:193
3 0x000000000040718d in main (argc=6, argv=0x7fffffffd628) at main.c:2165
Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
---
lib/compress.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/lib/compress.c b/lib/compress.c
index 995bc602b145..7e8142a48ae5 100644
--- a/lib/compress.c
+++ b/lib/compress.c
@@ -1388,12 +1388,10 @@ int erofs_commit_compressed_file(struct z_erofs_compress_ictx *ictx,
erofs_info("compressed %s (%llu bytes) into %llu bytes",
inode->i_srcpath, inode->i_size | 0ULL, ptotal | 0ULL);
- if (inode->idata_size) {
- bh->op = &erofs_skip_write_bhops;
+ if (inode->idata_size)
inode->bh_data = bh;
- } else {
+ else
erofs_bdrop(bh, false);
- }
inode->u.i_blocks = BLK_ROUND_UP(sbi, ptotal);
@@ -1690,7 +1688,7 @@ int erofs_mt_write_compressed_file(struct z_erofs_compress_ictx *ictx)
ret = PTR_ERR(bh);
goto out;
}
-
+ bh->op = &erofs_skip_write_bhops;
DBG_BUGON(!head);
pstart = erofs_pos(sbi, erofs_mapbh(NULL, bh->block));
@@ -1985,6 +1983,7 @@ int erofs_write_compressed_file(struct z_erofs_compress_ictx *ictx)
ret = PTR_ERR(bh);
goto err_free_idata;
}
+ bh->op = &erofs_skip_write_bhops;
pstart = erofs_pos(sbi, erofs_mapbh(NULL, bh->block));
ictx->seg_num = 1;
--
2.43.5
More information about the Linux-erofs
mailing list