]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
block: fix memory leak in __blkdev_issue_zero_pages
authorShaurya Rane <ssrane_b23@ee.vjti.ac.in>
Thu, 4 Dec 2025 18:12:59 +0000 (23:42 +0530)
committerJens Axboe <axboe@kernel.dk>
Thu, 4 Dec 2025 22:43:28 +0000 (15:43 -0700)
Move the fatal signal check before bio_alloc() to prevent a memory
leak when BLKDEV_ZERO_KILLABLE is set and a fatal signal is pending.

Previously, the bio was allocated before checking for a fatal signal.
If a signal was pending, the code would break out of the loop without
freeing or chaining the just-allocated bio, causing a memory leak.

This matches the pattern already used in __blkdev_issue_write_zeroes()
where the signal check precedes the allocation.

Fixes: bf86bcdb4012 ("blk-lib: check for kill signal in ioctl BLKZEROOUT")
Reported-by: syzbot+527a7e48a3d3d315d862@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=527a7e48a3d3d315d862
Signed-off-by: Shaurya Rane <ssrane_b23@ee.vjti.ac.in>
Reviewed-by: Keith Busch <kbusch@kernel.org>
Tested-by: syzbot+527a7e48a3d3d315d862@syzkaller.appspotmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-lib.c

index 19e0203cc18a9a1c2efde767c4d43c9f363ce635..9e2cc58f881f89018b62db85b3664293624be41e 100644 (file)
@@ -202,13 +202,13 @@ static void __blkdev_issue_zero_pages(struct block_device *bdev,
                unsigned int nr_vecs = __blkdev_sectors_to_bio_pages(nr_sects);
                struct bio *bio;
 
-               bio = bio_alloc(bdev, nr_vecs, REQ_OP_WRITE, gfp_mask);
-               bio->bi_iter.bi_sector = sector;
-
                if ((flags & BLKDEV_ZERO_KILLABLE) &&
                    fatal_signal_pending(current))
                        break;
 
+               bio = bio_alloc(bdev, nr_vecs, REQ_OP_WRITE, gfp_mask);
+               bio->bi_iter.bi_sector = sector;
+
                do {
                        unsigned int len;