Commit 899ee2c3 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe

block: initialize integrity buffer to zero before writing it to media

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: 7ba1ba12 ("block: Block layer data integrity support")
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: default avatarKanchan Joshi <joshi.k@samsung.com>
Reviewed-by: default avatarChaitanya Kulkarni <kch@nvidia.com>
Link: https://lore.kernel.org/r/20240613084839.1044015-2-hch@lst.deSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 73e3715e
...@@ -432,6 +432,7 @@ bool bio_integrity_prep(struct bio *bio) ...@@ -432,6 +432,7 @@ bool bio_integrity_prep(struct bio *bio)
unsigned long start, end; unsigned long start, end;
unsigned int len, nr_pages; unsigned int len, nr_pages;
unsigned int bytes, offset, i; unsigned int bytes, offset, i;
gfp_t gfp = GFP_NOIO;
if (!bi) if (!bi)
return true; return true;
...@@ -454,11 +455,19 @@ bool bio_integrity_prep(struct bio *bio) ...@@ -454,11 +455,19 @@ bool bio_integrity_prep(struct bio *bio)
if (!bi->profile->generate_fn || if (!bi->profile->generate_fn ||
!(bi->flags & BLK_INTEGRITY_GENERATE)) !(bi->flags & BLK_INTEGRITY_GENERATE))
return true; 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 */ /* Allocate kernel buffer for protection data */
len = bio_integrity_bytes(bi, bio_sectors(bio)); len = bio_integrity_bytes(bi, bio_sectors(bio));
buf = kmalloc(len, GFP_NOIO); buf = kmalloc(len, gfp);
if (unlikely(buf == NULL)) { if (unlikely(buf == NULL)) {
printk(KERN_ERR "could not allocate integrity buffer\n"); printk(KERN_ERR "could not allocate integrity buffer\n");
goto err_end_io; goto err_end_io;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment