diff options
| author | Erez Shitrit <erezsh@mellanox.com> | 2016-08-28 10:58:30 +0300 | 
|---|---|---|
| committer | Doug Ledford <dledford@redhat.com> | 2016-09-02 14:06:27 -0400 | 
| commit | 68c6bcdd8bd00394c234b915ab9b97c74104130c (patch) | |
| tree | ba48101e224393e9481e965e5e103dc36ff6958a /drivers/infiniband/core/multicast.c | |
| parent | 656aacea6c90ce8e15c2bdef4f89b74b73e2e34a (diff) | |
| download | blackbird-op-linux-68c6bcdd8bd00394c234b915ab9b97c74104130c.tar.gz blackbird-op-linux-68c6bcdd8bd00394c234b915ab9b97c74104130c.zip  | |
IB/core: Fix use after free in send_leave function
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>
Diffstat (limited to 'drivers/infiniband/core/multicast.c')
| -rw-r--r-- | drivers/infiniband/core/multicast.c | 13 | 
1 files changed, 2 insertions, 11 deletions
diff --git a/drivers/infiniband/core/multicast.c b/drivers/infiniband/core/multicast.c index 3a3c5d73bbfc..51c79b2fb0b8 100644 --- a/drivers/infiniband/core/multicast.c +++ b/drivers/infiniband/core/multicast.c @@ -106,7 +106,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; @@ -340,11 +339,7 @@ static int send_join(struct mcast_group *group, struct mcast_member *member)  				       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) @@ -364,11 +359,7 @@ static int send_leave(struct mcast_group *group, u8 leave_state)  				       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,  | 

