lkml.org 
[lkml]   [2021]   [Oct]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 59/95] mm, slub: fix mismatch between reconstructed freelist depth and cnt
    Date
    From: Miaohe Lin <linmiaohe@huawei.com>

    commit 899447f669da76cc3605665e1a95ee877bc464cc upstream.

    If object's reuse is delayed, it will be excluded from the reconstructed
    freelist. But we forgot to adjust the cnt accordingly. So there will
    be a mismatch between reconstructed freelist depth and cnt. This will
    lead to free_debug_processing() complaining about freelist count or a
    incorrect slub inuse count.

    Link: https://lkml.kernel.org/r/20210916123920.48704-3-linmiaohe@huawei.com
    Fixes: c3895391df38 ("kasan, slub: fix handling of kasan_slab_free hook")
    Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
    Reviewed-by: Vlastimil Babka <vbabka@suse.cz>
    Cc: Andrey Konovalov <andreyknvl@gmail.com>
    Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
    Cc: Bharata B Rao <bharata@linux.ibm.com>
    Cc: Christoph Lameter <cl@linux.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Faiyaz Mohammed <faiyazm@codeaurora.org>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: Roman Gushchin <guro@fb.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    mm/slub.c | 11 +++++++++--
    1 file changed, 9 insertions(+), 2 deletions(-)

    --- a/mm/slub.c
    +++ b/mm/slub.c
    @@ -1543,7 +1543,8 @@ static __always_inline bool slab_free_ho
    }

    static inline bool slab_free_freelist_hook(struct kmem_cache *s,
    - void **head, void **tail)
    + void **head, void **tail,
    + int *cnt)
    {

    void *object;
    @@ -1578,6 +1579,12 @@ static inline bool slab_free_freelist_ho
    *head = object;
    if (!*tail)
    *tail = object;
    + } else {
    + /*
    + * Adjust the reconstructed freelist depth
    + * accordingly if object's reuse is delayed.
    + */
    + --(*cnt);
    }
    } while (object != old_tail);

    @@ -3137,7 +3144,7 @@ static __always_inline void slab_free(st
    * With KASAN enabled slab_free_freelist_hook modifies the freelist
    * to remove objects, whose reuse must be delayed.
    */
    - if (slab_free_freelist_hook(s, &head, &tail))
    + if (slab_free_freelist_hook(s, &head, &tail, &cnt))
    do_slab_free(s, page, head, tail, cnt, addr);
    }


    \
     
     \ /
      Last update: 2021-10-25 22:10    [W:4.022 / U:0.772 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site