lkml.org 
[lkml]   [2020]   [Mar]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH 16/21] list_bl: Extend integrity checking in deletion routines
    Date
    Although deleting an entry from an 'hlist_bl' optionally checks that the
    node being removed is unlocked before subsequently removing it and
    poisoning its pointers, we don't actually check for the poison values
    like we do for other list implementations.

    Add poison checks to __hlist_bl_del_valid() so that we can catch list
    corruption without relying on a later fault.

    Cc: Kees Cook <keescook@chromium.org>
    Cc: Paul E. McKenney <paulmck@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Signed-off-by: Will Deacon <will@kernel.org>
    ---
    include/linux/list_bl.h | 10 +++++++++-
    1 file changed, 9 insertions(+), 1 deletion(-)

    diff --git a/include/linux/list_bl.h b/include/linux/list_bl.h
    index f48d8acb15b4..0839c4f43e6d 100644
    --- a/include/linux/list_bl.h
    +++ b/include/linux/list_bl.h
    @@ -48,7 +48,15 @@ static inline bool __hlist_bl_add_head_valid(struct hlist_bl_head *h,
    static inline bool __hlist_bl_del_valid(struct hlist_bl_node *n)
    {
    unsigned long nlock = (unsigned long)n & LIST_BL_LOCKMASK;
    - return !CHECK_DATA_CORRUPTION(nlock, "hlist_bl_del_valid: node locked");
    +
    + return !(CHECK_DATA_CORRUPTION(nlock,
    + "hlist_bl_del_valid: node locked") ||
    + CHECK_DATA_CORRUPTION(n->next == LIST_POISON1,
    + "hlist_bl_del corruption, %px->next is LIST_POISON1 (%px)\n",
    + n, LIST_POISON1) ||
    + CHECK_DATA_CORRUPTION(n->pprev == LIST_POISON2,
    + "hlist_bl_del corruption, %px->pprev is LIST_POISON2 (%px)\n",
    + n, LIST_POISON2));
    }
    #else
    static inline bool __hlist_bl_add_head_valid(struct hlist_bl_head *h,
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-03-24 16:38    [W:4.100 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site