diff options
author | Jon Maloy <jon.maloy@ericsson.com> | 2018-01-17 16:42:46 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-01-19 15:12:21 -0500 |
commit | 60c2530696320ee6ffe4491c17079fa403790c98 (patch) | |
tree | 619bdaecd86e48c1962a6866e40ada7e09c5addc /net/tipc/group.h | |
parent | 30c3e9d470358a6741e00e1034a1ea85c6a516f0 (diff) | |
download | linux-stable-60c2530696320ee6ffe4491c17079fa403790c98.tar.gz linux-stable-60c2530696320ee6ffe4491c17079fa403790c98.tar.bz2 linux-stable-60c2530696320ee6ffe4491c17079fa403790c98.zip |
tipc: fix race between poll() and setsockopt()
Letting tipc_poll() dereference a socket's pointer to struct tipc_group
entails a race risk, as the group item may be deleted in a concurrent
tipc_sk_join() or tipc_sk_leave() thread.
We now move the 'open' flag in struct tipc_group to struct tipc_sock,
and let the former retain only a pointer to the moved field. This will
eliminate the race risk.
Reported-by: syzbot+799dafde0286795858ac@syzkaller.appspotmail.com
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/group.h')
-rw-r--r-- | net/tipc/group.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/net/tipc/group.h b/net/tipc/group.h index f4a596ed9848..5996af6e9f1d 100644 --- a/net/tipc/group.h +++ b/net/tipc/group.h @@ -43,7 +43,8 @@ struct tipc_member; struct tipc_msg; struct tipc_group *tipc_group_create(struct net *net, u32 portid, - struct tipc_group_req *mreq); + struct tipc_group_req *mreq, + bool *group_is_open); void tipc_group_join(struct net *net, struct tipc_group *grp, int *sk_rcv_buf); void tipc_group_delete(struct net *net, struct tipc_group *grp); void tipc_group_add_member(struct tipc_group *grp, u32 node, @@ -67,7 +68,6 @@ void tipc_group_update_bc_members(struct tipc_group *grp, int len, bool ack); bool tipc_group_cong(struct tipc_group *grp, u32 dnode, u32 dport, int len, struct tipc_member **m); bool tipc_group_bc_cong(struct tipc_group *grp, int len); -bool tipc_group_is_open(struct tipc_group *grp); void tipc_group_update_rcv_win(struct tipc_group *grp, int blks, u32 node, u32 port, struct sk_buff_head *xmitq); u16 tipc_group_bc_snd_nxt(struct tipc_group *grp); |