On Fri, 1 Oct 2021 at 04:42, Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> wrote: > If an object is allocated on a tail page of a multi-page slab, kasan > will get the wrong tag because page->s_mem is NULL for tail pages. > I'm not quite sure what the user-visible effect of this might be. > > Fixes: 7f94ffbc4c6a ("kasan: add hooks implementation for tag-based mode") > Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> Acked-by: Marco Elver <elver@xxxxxxxxxx> Indeed this looks wrong. I don't know how much this code is even tested, because it depends on CONFIG_KASAN_SW_TAGS && CONFIG_SLAB, and the cache having a constructor or SLAB_TYPESAFE_BY_RCU. HW_TAGS isn't affected because it doesn't work with SLAB. And to run SW_TAGS, one needs an arm64 CPU with TBI. And the instances of KASAN_SW_TAGS I'm aware of use SLUB. With eventual availability of Intel LAM, I expect KASAN_SW_TAGS to become more widely used though, including its SLAB support. > --- > mm/kasan/common.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/mm/kasan/common.c b/mm/kasan/common.c > index 2baf121fb8c5..41779ad109cd 100644 > --- a/mm/kasan/common.c > +++ b/mm/kasan/common.c > @@ -298,7 +298,7 @@ static inline u8 assign_tag(struct kmem_cache *cache, > /* For caches that either have a constructor or SLAB_TYPESAFE_BY_RCU: */ > #ifdef CONFIG_SLAB > /* For SLAB assign tags based on the object index in the freelist. */ > - return (u8)obj_to_index(cache, virt_to_page(object), (void *)object); > + return (u8)obj_to_index(cache, virt_to_head_page(object), (void *)object); > #else > /* > * For SLUB assign a random tag during slab creation, otherwise reuse > -- > 2.32.0