On Sat, Mar 24, 2018 at 9:29 AM, Ingo Molnar <mingo@xxxxxxxxxx> wrote: > > * Andrey Konovalov <andreyknvl@xxxxxxxxxx> wrote: > >> The krealloc function checks where the same buffer was reused or a new one >> allocated by comparing kernel pointers. KHWASAN changes memory tag on the >> krealloc'ed chunk of memory and therefore also changes the pointer tag of >> the returned pointer. Therefore we need to perform comparison on untagged >> (with tags reset) pointers to check whether it's the same memory region or >> not. >> >> Signed-off-by: Andrey Konovalov <andreyknvl@xxxxxxxxxx> >> --- >> mm/slab_common.c | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/mm/slab_common.c b/mm/slab_common.c >> index a33e61315ca6..5911f2194cf7 100644 >> --- a/mm/slab_common.c >> +++ b/mm/slab_common.c >> @@ -1494,7 +1494,7 @@ void *krealloc(const void *p, size_t new_size, gfp_t flags) >> } >> >> ret = __do_krealloc(p, new_size, flags); >> - if (ret && p != ret) >> + if (ret && khwasan_reset_tag(p) != khwasan_reset_tag(ret)) >> kfree(p); > > Small nit: > > If 'reset' here means an all zeroes tag (upper byte) then khwasan_clear_tag() > might be a slightly easier to read primitive? 'Reset' means to set the upper byte to the value that is native for kernel pointers, and that is 0xFF. So it sets the tag to all ones, not all zeroes. I can still rename it to khwasan_clear_tag(), if you think that makes sense in this case as well.