erofs: fix general protection fault when reading fragment
authorYue Hu <huyue2@coolpad.com>
Fri, 21 Oct 2022 08:53:25 +0000 (16:53 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Tue, 8 Nov 2022 06:44:13 +0000 (14:44 +0800)
As syzbot reported [1], the fragment feature sb flag is not set, so
packed_inode != NULL needs to be checked in z_erofs_read_fragment().

[1] https://lore.kernel.org/all/0000000000002e7a8905eb841ddd@google.com/

Reported-by: syzbot+3faecbfd845a895c04cb@syzkaller.appspotmail.com
Fixes: b15b2e307c3a ("erofs: support on-disk compressed fragments data")
Signed-off-by: Yue Hu <huyue2@coolpad.com>
Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Link: https://lore.kernel.org/r/20221021085325.25788-1-zbestahu@gmail.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
fs/erofs/zdata.c

index c7f24fc..d6caf27 100644 (file)
@@ -660,6 +660,9 @@ static int z_erofs_read_fragment(struct inode *inode, erofs_off_t pos,
        u8 *src, *dst;
        unsigned int i, cnt;
 
+       if (!packed_inode)
+               return -EFSCORRUPTED;
+
        pos += EROFS_I(inode)->z_fragmentoff;
        for (i = 0; i < len; i += cnt) {
                cnt = min_t(unsigned int, len - i,