]> xenbits.xensource.com Git - people/royger/xen.git/commitdiff
x86/ioremap: prevent additions against the NULL pointer
authorRoger Pau Monne <roger.pau@citrix.com>
Thu, 13 Mar 2025 11:19:48 +0000 (12:19 +0100)
committerRoger Pau Monne <roger.pau@citrix.com>
Thu, 13 Mar 2025 11:44:12 +0000 (12:44 +0100)
This was reported by clang UBSAN as:

UBSAN: Undefined behaviour in arch/x86/mm.c:6297:40
applying zero offset to null pointer
[...]
Xen call trace:
    [<ffff82d040303662>] R common/ubsan/ubsan.c#ubsan_epilogue+0xa/0xc0
    [<ffff82d040304aa3>] F __ubsan_handle_pointer_overflow+0xcb/0x100
    [<ffff82d0406ebbc0>] F ioremap_wc+0xc8/0xe0
    [<ffff82d0406c3728>] F video_init+0xd0/0x180
    [<ffff82d0406ab6f5>] F console_init_preirq+0x3d/0x220
    [<ffff82d0406f1876>] F __start_xen+0x68e/0x5530
    [<ffff82d04020482e>] F __high_start+0x8e/0x90

Fix both ioremap{,_wc}() to not add the offset if the returned pointer from
__vmap() is NULL.

Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
xen/arch/x86/mm.c

index bfdc8fb0194972b2a18dc6e3c7b3eb6ca8fe12b3..4af6c4ce86d6dfb03384cad2f720bbf576220205 100644 (file)
@@ -6277,7 +6277,9 @@ void __iomem *ioremap(paddr_t pa, size_t len)
         unsigned int offs = pa & (PAGE_SIZE - 1);
         unsigned int nr = PFN_UP(offs + len);
 
-        va = __vmap(&mfn, nr, 1, 1, PAGE_HYPERVISOR_UCMINUS, VMAP_DEFAULT) + offs;
+        va = __vmap(&mfn, nr, 1, 1, PAGE_HYPERVISOR_UCMINUS, VMAP_DEFAULT);
+        if ( va )
+            va += offs;
     }
 
     return (void __force __iomem *)va;
@@ -6294,7 +6296,7 @@ void __iomem *__init ioremap_wc(paddr_t pa, size_t len)
 
     va = __vmap(&mfn, nr, 1, 1, PAGE_HYPERVISOR_WC, VMAP_DEFAULT);
 
-    return (void __force __iomem *)(va + offs);
+    return (void __force __iomem *)(va ? va + offs : va);
 }
 
 int create_perdomain_mapping(struct domain *d, unsigned long va,