[dm-devel] [PATCH 1/3] dm-flakey: don't corrupt the zero page

Sweet Tea Dorminy sweettea-kernel at dorminy.me
Mon Jan 23 04:59:39 UTC 2023



On 1/22/23 14:02, Mikulas Patocka wrote:
> When we need to zero some range on a block device, the function
> __blkdev_issue_zero_pages submits a write bio with the bio vector pointing
> to the zero page. If we use dm-flakey with corrupt bio writes option, it
> will corrupt the content of the zero page which results in crashes of
> various userspace programs. Glibc assumes that memory returned by mmap is
> zeroed and it uses it for calloc implementation; if the newly mapped
> memory is not zeroed, calloc will return non-zeroed memory.
> 
> This patches fixes the bug by testing if the page is equal to ZERO_PAGE(0)
> and avoiding the corruption in this case.

Nice catch!
> 
> Signed-off-by: Mikulas Patocka <mpatocka at redhat.com>
> Cc: stable at vger.kernel.org
Reviewed-by: Sweet Tea Dorminy <sweettea-kernel at dorminy.me>
> 
> ---
>   drivers/md/dm-flakey.c |    7 +++++--
>   1 file changed, 5 insertions(+), 2 deletions(-)
> 
> Index: bcachefs/drivers/md/dm-flakey.c
> ===================================================================
> --- bcachefs.orig/drivers/md/dm-flakey.c	2023-01-22 16:56:35.000000000 +0100
> +++ bcachefs/drivers/md/dm-flakey.c	2023-01-22 16:58:40.000000000 +0100
> @@ -303,8 +303,11 @@ static void corrupt_bio_data(struct bio
>   	 */
>   	bio_for_each_segment(bvec, bio, iter) {
>   		if (bio_iter_len(bio, iter) > corrupt_bio_byte) {
> -			char *segment = (page_address(bio_iter_page(bio, iter))
> -					 + bio_iter_offset(bio, iter));
> +			char *segment;
> +			struct page *page = bio_iter_page(bio, iter);
> +			if (unlikely(page == ZERO_PAGE(0)))
> +				break;
> +			segment = (page_address(page) + bio_iter_offset(bio, iter));
>   			segment[corrupt_bio_byte] = fc->corrupt_bio_value;
>   			DMDEBUG("Corrupting data bio=%p by writing %u to byte %u "
>   				"(rw=%c bi_opf=%u bi_sector=%llu size=%u)\n",
> --
> dm-devel mailing list
> dm-devel at redhat.com
> https://listman.redhat.com/mailman/listinfo/dm-devel



More information about the dm-devel mailing list