summaryrefslogtreecommitdiff
path: root/block
diff options
context:
space:
mode:
authorShaurya Rane <ssrane_b23@ee.vjti.ac.in>2025-12-04 23:42:59 +0530
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2025-12-18 13:55:19 +0100
commit453e4b0c84d0db1454ff0adf655d91179e6fca3a (patch)
treed4ce85b368d8981832427987dacce192c0991ac9 /block
parentb8da217fc928089370d8250cf049ed60455267ad (diff)
downloadlinux-453e4b0c84d0db1454ff0adf655d91179e6fca3a.tar.gz
linux-453e4b0c84d0db1454ff0adf655d91179e6fca3a.tar.bz2
linux-453e4b0c84d0db1454ff0adf655d91179e6fca3a.zip
block: fix memory leak in __blkdev_issue_zero_pages
[ Upstream commit f7e3f852a42d7cd8f1af2c330d9d153e30c8adcf ] 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> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'block')
-rw-r--r--block/blk-lib.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/block/blk-lib.c b/block/blk-lib.c
index 4c9f20a689f7..8cb2987db786 100644
--- a/block/blk-lib.c
+++ b/block/blk-lib.c
@@ -200,13 +200,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, added;