erofs: fix inconsistent per-file compression format
authorGao Xiang <hsiangkao@linux.alibaba.com>
Sat, 13 Jan 2024 15:06:02 +0000 (23:06 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Sat, 13 Jan 2024 15:58:08 +0000 (23:58 +0800)
commit118a8cf504d7dfa519562d000f423ee3ca75d2c4
tree234b9fca62aa49309c6ebf19ec8c82e422858e0b
parent0dd3ee31125508cd67f7e7172247f05b7fd1753a
erofs: fix inconsistent per-file compression format

EROFS can select compression algorithms on a per-file basis, and each
per-file compression algorithm needs to be marked in the on-disk
superblock for initialization.

However, syzkaller can generate inconsistent crafted images that use
an unsupported algorithmtype for specific inodes, e.g. use MicroLZMA
algorithmtype even it's not set in `sbi->available_compr_algs`.  This
can lead to an unexpected "BUG: kernel NULL pointer dereference" if
the corresponding decompressor isn't built-in.

Fix this by checking against `sbi->available_compr_algs` for each
m_algorithmformat request.  Incorrect !erofs_sb_has_compr_cfgs preset
bitmap is now fixed together since it was harmless previously.

Reported-by: <bugreport@ubisectech.com>
Fixes: 8f89926290c4 ("erofs: get compression algorithms directly on mapping")
Fixes: 622ceaddb764 ("erofs: lzma compression support")
Reviewed-by: Yue Hu <huyue2@coolpad.com>
Link: https://lore.kernel.org/r/20240113150602.1471050-1-hsiangkao@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
fs/erofs/decompressor.c
fs/erofs/zmap.c