On 2024-10-23 at 20:41:57 +0200, Andrey Konovalov wrote: >On Tue, Oct 22, 2024 at 3:59 AM Samuel Holland ><samuel.holland@xxxxxxxxxx> wrote: ... >> + * Software Tag-Based KASAN, the displacement is signed, so >> + * KASAN_SHADOW_OFFSET is the center of the range. >> */ >> - if (addr < KASAN_SHADOW_OFFSET) >> - return; >> + if (IS_ENABLED(CONFIG_KASAN_GENERIC)) { >> + if (addr < KASAN_SHADOW_OFFSET || >> + addr >= KASAN_SHADOW_OFFSET + max_shadow_size) >> + return; >> + } else { >> + if (addr < KASAN_SHADOW_OFFSET - max_shadow_size / 2 || >> + addr >= KASAN_SHADOW_OFFSET + max_shadow_size / 2) >> + return; > >Hm, I might be wrong, but I think this check does not work. > >Let's say we have non-canonical address 0x4242424242424242 and number >of VA bits is 48. > >Then: > >KASAN_SHADOW_OFFSET == 0xffff800000000000 >kasan_mem_to_shadow(0x4242424242424242) == 0x0423a42424242424 >max_shadow_size == 0x1000000000000000 >KASAN_SHADOW_OFFSET - max_shadow_size / 2 == 0xf7ff800000000000 >KASAN_SHADOW_OFFSET + max_shadow_size / 2 == 0x07ff800000000000 (overflows) > >0x0423a42424242424 is < than 0xf7ff800000000000, so the function will >wrongly return. As I understand this check aims to figure out if the address landed in shadow space and if it didn't we can return. Can't this above snippet be a simple: if (!addr_in_shadow(addr)) return; ? -- Kind regards Maciej Wieczór-Retman