From 37e2394c94303f2adf320c791df75a3b46791d1a Mon Sep 17 00:00:00 2001 From: OGAWA Hirofumi Date: Fri, 17 Mar 2023 08:00:30 +0000 Subject: [PATCH] block: Fix wrong offset in bio_truncate() mainline inclusion from mainline-v5.17-rc1 commit 3ee859e384d453d6ac68bfd5971f630d9fa46ad3 category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/I6GTUI CVE: NA Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3ee859e384d453d6ac68bfd5971f630d9fa46ad3 -------------------------------- bio_truncate() clears the buffer outside of last block of bdev, however current bio_truncate() is using the wrong offset of page. So it can return the uninitialized data. This happened when both of truncated/corrupted FS and userspace (via bdev) are trying to read the last of bdev. Reported-by: syzbot+ac94ae5f68b84197f41c@syzkaller.appspotmail.com Signed-off-by: OGAWA Hirofumi Reviewed-by: Ming Lei Link: https://lore.kernel.org/r/875yqt1c9g.fsf@mail.parknet.co.jp Signed-off-by: Jens Axboe Signed-off-by: Yu Kuai Reviewed-by: Hou Tao Signed-off-by: Yongqiang Liu --- block/bio.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/block/bio.c b/block/bio.c index a1c74f10d604..9d70ebe4122c 100644 --- a/block/bio.c +++ b/block/bio.c @@ -578,7 +578,8 @@ void bio_truncate(struct bio *bio, unsigned new_size) offset = new_size - done; else offset = 0; - zero_user(bv.bv_page, offset, bv.bv_len - offset); + zero_user(bv.bv_page, bv.bv_offset + offset, + bv.bv_len - offset); truncated = true; } done += bv.bv_len; -- GitLab