• A
    kasan: fix per-page tags for non-page_alloc pages · cf10bd4c
    Andrey Konovalov 提交于
    To allow performing tag checks on page_alloc addresses obtained via
    page_address(), tag-based KASAN modes store tags for page_alloc
    allocations in page->flags.
    
    Currently, the default tag value stored in page->flags is 0x00.
    Therefore, page_address() returns a 0x00ffff...  address for pages that
    were not allocated via page_alloc.
    
    This might cause problems.  A particular case we encountered is a
    conflict with KFENCE.  If a KFENCE-allocated slab object is being freed
    via kfree(page_address(page) + offset), the address passed to kfree()
    will get tagged with 0x00 (as slab pages keep the default per-page
    tags).  This leads to is_kfence_address() check failing, and a KFENCE
    object ending up in normal slab freelist, which causes memory
    corruptions.
    
    This patch changes the way KASAN stores tag in page-flags: they are now
    stored xor'ed with 0xff.  This way, KASAN doesn't need to initialize
    per-page flags for every created page, which might be slow.
    
    With this change, page_address() returns natively-tagged (with 0xff)
    pointers for pages that didn't have tags set explicitly.
    
    This patch fixes the encountered conflict with KFENCE and prevents more
    similar issues that can occur in the future.
    
    Link: https://lkml.kernel.org/r/1a41abb11c51b264511d9e71c303bb16d5cb367b.1615475452.git.andreyknvl@google.com
    Fixes: 2813b9c0 ("kasan, mm, arm64: tag non slab memory allocated via pagealloc")
    Signed-off-by: NAndrey Konovalov <andreyknvl@google.com>
    Reviewed-by: NMarco Elver <elver@google.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
    Cc: Alexander Potapenko <glider@google.com>
    Cc: Peter Collingbourne <pcc@google.com>
    Cc: Evgenii Stepanov <eugenis@google.com>
    Cc: Branislav Rankov <Branislav.Rankov@arm.com>
    Cc: Kevin Brodsky <kevin.brodsky@arm.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    cf10bd4c
mm.h 100.1 KB