mm/z3fold: avoid possible underflow in z3fold_alloc()
authorMiaohe Lin <linmiaohe@huawei.com>
Thu, 1 Jul 2021 01:50:27 +0000 (18:50 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 1 Jul 2021 03:47:28 +0000 (20:47 -0700)
It is not enough to just make sure the z3fold header is not larger than
the page size.  When z3fold header is equal to PAGE_SIZE, we would
underflow when check alloc size against PAGE_SIZE - ZHDR_SIZE_ALIGNED -
CHUNK_SIZE in z3fold_alloc().  Make sure there has remaining spaces for
its buddy to fix this theoretical issue.

Link: https://lkml.kernel.org/r/20210619093151.1492174-3-linmiaohe@huawei.com
Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
Reviewed-by: Vitaly Wool <vitaly.wool@konsulko.com>
Cc: Hillf Danton <hdanton@sina.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/z3fold.c

index 0d0b816..64ddf86 100644 (file)
@@ -1803,8 +1803,11 @@ static int __init init_z3fold(void)
 {
        int ret;
 
-       /* Make sure the z3fold header is not larger than the page size */
-       BUILD_BUG_ON(ZHDR_SIZE_ALIGNED > PAGE_SIZE);
+       /*
+        * Make sure the z3fold header is not larger than the page size and
+        * there has remaining spaces for its buddy.
+        */
+       BUILD_BUG_ON(ZHDR_SIZE_ALIGNED > PAGE_SIZE - CHUNK_SIZE);
        ret = z3fold_mount();
        if (ret)
                return ret;