]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
staging: erofs: some compressed cluster should be submitted for corrupted images
authorGao Xiang <gaoxiang25@huawei.com>
Wed, 9 Oct 2019 10:05:51 +0000 (18:05 +0800)
committerKhalid Elmously <khalid.elmously@canonical.com>
Fri, 18 Oct 2019 08:26:42 +0000 (04:26 -0400)
BugLink: https://bugs.launchpad.net/bugs/1848039
commit ee45197c807895e156b2be0abcaebdfc116487c8 upstream.

As reported by erofs_utils fuzzer, a logical page can belong
to at most 2 compressed clusters, if one compressed cluster
is corrupted, but the other has been ready in submitting chain.

The chain needs to submit anyway in order to keep the page
working properly (page unlocked with PG_error set, PG_uptodate
not set).

Let's fix it now.

Fixes: 3883a79abd02 ("staging: erofs: introduce VLE decompression support")
Cc: <stable@vger.kernel.org> # 4.19+
Signed-off-by: Gao Xiang <gaoxiang25@huawei.com>
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Link: https://lore.kernel.org/r/20190819103426.87579-2-gaoxiang25@huawei.com
[ Gao Xiang: Manually backport to v5.3.y stable. ]
Signed-off-by: Gao Xiang <gaoxiang25@huawei.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Paolo Pisati <paolo.pisati@canonical.com>
Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
drivers/staging/erofs/unzip_vle.c

index f0dab81ff8167f89d1bd21241abbed335dd810cd..438d78db69cfeeb80ac75a10c2fe9f763ecc467a 100644 (file)
@@ -1498,19 +1498,18 @@ static int z_erofs_vle_normalaccess_readpage(struct file *file,
        err = z_erofs_do_read_page(&f, page, &pagepool);
        (void)z_erofs_vle_work_iter_end(&f.builder);
 
-       if (err) {
+       /* if some compressed cluster ready, need submit them anyway */
+       z_erofs_submit_and_unzip(&f, &pagepool, true);
+
+       if (err)
                errln("%s, failed to read, err [%d]", __func__, err);
-               goto out;
-       }
 
-       z_erofs_submit_and_unzip(&f, &pagepool, true);
-out:
        if (f.map.mpage)
                put_page(f.map.mpage);
 
        /* clean up the remaining free pages */
        put_pages_list(&pagepool);
-       return 0;
+       return err;
 }
 
 static int z_erofs_vle_normalaccess_readpages(struct file *filp,