lkml.org 
[lkml]   [2016]   [Oct]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.7 120/141] IB/core: Fix use after free in send_leave function
    Date
    4.7-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Erez Shitrit <erezsh@mellanox.com>

    commit 68c6bcdd8bd00394c234b915ab9b97c74104130c upstream.

    The function send_leave sets the member: group->query_id
    (group->query_id = ret) after calling the sa_query, but leave_handler
    can be executed before the setting and it might delete the group object,
    and will get a memory corruption.

    Additionally, this patch gets rid of group->query_id variable which is
    not used.

    Fixes: faec2f7b96b5 ('IB/sa: Track multicast join/leave requests')
    Signed-off-by: Erez Shitrit <erezsh@mellanox.com>
    Signed-off-by: Leon Romanovsky <leon@kernel.org>
    Signed-off-by: Doug Ledford <dledford@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/infiniband/core/multicast.c | 13 ++-----------
    1 file changed, 2 insertions(+), 11 deletions(-)

    --- a/drivers/infiniband/core/multicast.c
    +++ b/drivers/infiniband/core/multicast.c
    @@ -118,7 +118,6 @@ struct mcast_group {
    atomic_t refcount;
    enum mcast_group_state state;
    struct ib_sa_query *query;
    - int query_id;
    u16 pkey_index;
    u8 leave_state;
    int retries;
    @@ -352,11 +351,7 @@ static int send_join(struct mcast_group
    member->multicast.comp_mask,
    3000, GFP_KERNEL, join_handler, group,
    &group->query);
    - if (ret >= 0) {
    - group->query_id = ret;
    - ret = 0;
    - }
    - return ret;
    + return (ret > 0) ? 0 : ret;
    }

    static int send_leave(struct mcast_group *group, u8 leave_state)
    @@ -376,11 +371,7 @@ static int send_leave(struct mcast_group
    IB_SA_MCMEMBER_REC_JOIN_STATE,
    3000, GFP_KERNEL, leave_handler,
    group, &group->query);
    - if (ret >= 0) {
    - group->query_id = ret;
    - ret = 0;
    - }
    - return ret;
    + return (ret > 0) ? 0 : ret;
    }

    static void join_group(struct mcast_group *group, struct mcast_member *member,

    \
     
     \ /
      Last update: 2016-10-06 11:31    [W:4.038 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site