ubifs: fix double return leb in ubifs_garbage_collect
authorBaokun Li <libaokun1@huawei.com>
Mon, 15 Nov 2021 01:31:43 +0000 (09:31 +0800)
committerRichard Weinberger <richard@nod.at>
Thu, 23 Dec 2021 21:28:23 +0000 (22:28 +0100)
If ubifs_garbage_collect_leb() returns -EAGAIN and enters the "out"
branch, ubifs_return_leb will execute twice on the same lnum. This
can cause data loss in concurrency situations.

Reported-by: Hulk Robot <hulkci@huawei.com>
Signed-off-by: Baokun Li <libaokun1@huawei.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
fs/ubifs/gc.c

index 05e1eea..1f74a12 100644 (file)
@@ -758,6 +758,8 @@ int ubifs_garbage_collect(struct ubifs_info *c, int anyway)
                                err = ubifs_return_leb(c, lp.lnum);
                                if (err)
                                        ret = err;
+                               /*  Maybe double return LEB if goto out */
+                               lp.lnum = -1;
                                break;
                        }
                        goto out;