]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
swiotlb: skip swiotlb_bounce when orig_addr is zero
authorLiu Shixin <liushixin2@huawei.com>
Thu, 30 Jun 2022 11:33:31 +0000 (19:33 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 2 Jul 2022 14:27:40 +0000 (16:27 +0200)
After patch ddbd89deb7d3 ("swiotlb: fix info leak with DMA_FROM_DEVICE"),
swiotlb_bounce will be called in swiotlb_tbl_map_single unconditionally.
This requires that the physical address must be valid, which is not always
true on stable-4.19 or earlier version.
On stable-4.19, swiotlb_alloc_buffer will call swiotlb_tbl_map_single with
orig_addr equal to zero, which cause such a panic:

Unable to handle kernel paging request at virtual address ffffb77a40000000
...
pc : __memcpy+0x100/0x180
lr : swiotlb_bounce+0x74/0x88
...
Call trace:
 __memcpy+0x100/0x180
 swiotlb_tbl_map_single+0x2c8/0x338
 swiotlb_alloc+0xb4/0x198
 __dma_alloc+0x84/0x1d8
 ...

On stable-4.9 and stable-4.14, swiotlb_alloc_coherent wille call map_single
with orig_addr equal to zero, which can cause same panic.

Fix this by skipping swiotlb_bounce when orig_addr is zero.

Fixes: ddbd89deb7d3 ("swiotlb: fix info leak with DMA_FROM_DEVICE")
Signed-off-by: Liu Shixin <liushixin2@huawei.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
kernel/dma/swiotlb.c

index 8b1360772fc584a57a142d6dc499c348031d3b13..b1e2ce2f9c2dea9f97c05e7de57b9ac5bff30f14 100644 (file)
@@ -594,7 +594,8 @@ found:
         * unconditional bounce may prevent leaking swiotlb content (i.e.
         * kernel memory) to user-space.
         */
-       swiotlb_bounce(orig_addr, tlb_addr, size, DMA_TO_DEVICE);
+       if (orig_addr)
+               swiotlb_bounce(orig_addr, tlb_addr, size, DMA_TO_DEVICE);
        return tlb_addr;
 }