| From f4facc2b0739976a0adcb4e5c740653f7125fb0d Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 13 Jun 2024 10:48:11 +0200 |
| Subject: block: initialize integrity buffer to zero before writing it to media |
| |
| From: Christoph Hellwig <hch@lst.de> |
| |
| [ Upstream commit 899ee2c3829c5ac14bfc7d3c4a5846c0b709b78f ] |
| |
| Metadata added by bio_integrity_prep is using plain kmalloc, which leads |
| to random kernel memory being written media. For PI metadata this is |
| limited to the app tag that isn't used by kernel generated metadata, |
| but for non-PI metadata the entire buffer leaks kernel memory. |
| |
| Fix this by adding the __GFP_ZERO flag to allocations for writes. |
| |
| Fixes: 7ba1ba12eeef ("block: Block layer data integrity support") |
| Signed-off-by: Christoph Hellwig <hch@lst.de> |
| Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Reviewed-by: Kanchan Joshi <joshi.k@samsung.com> |
| Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com> |
| Link: https://lore.kernel.org/r/20240613084839.1044015-2-hch@lst.de |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| block/bio-integrity.c | 11 ++++++++++- |
| 1 file changed, 10 insertions(+), 1 deletion(-) |
| |
| diff --git a/block/bio-integrity.c b/block/bio-integrity.c |
| index 8b528e12136f5..741581a752c47 100644 |
| --- a/block/bio-integrity.c |
| +++ b/block/bio-integrity.c |
| @@ -454,6 +454,7 @@ bool bio_integrity_prep(struct bio *bio) |
| unsigned long start, end; |
| unsigned int len, nr_pages; |
| unsigned int bytes, offset, i; |
| + gfp_t gfp = GFP_NOIO; |
| |
| if (!bi) |
| return true; |
| @@ -476,11 +477,19 @@ bool bio_integrity_prep(struct bio *bio) |
| if (!bi->profile->generate_fn || |
| !(bi->flags & BLK_INTEGRITY_GENERATE)) |
| return true; |
| + |
| + /* |
| + * Zero the memory allocated to not leak uninitialized kernel |
| + * memory to disk. For PI this only affects the app tag, but |
| + * for non-integrity metadata it affects the entire metadata |
| + * buffer. |
| + */ |
| + gfp |= __GFP_ZERO; |
| } |
| |
| /* Allocate kernel buffer for protection data */ |
| len = bio_integrity_bytes(bi, bio_sectors(bio)); |
| - buf = kmalloc(len, GFP_NOIO); |
| + buf = kmalloc(len, gfp); |
| if (unlikely(buf == NULL)) { |
| printk(KERN_ERR "could not allocate integrity buffer\n"); |
| goto err_end_io; |
| -- |
| 2.43.0 |
| |