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>
This commit is contained in:

committed by
David S. Miller

parent
30c3e9d470
commit
60c2530696
@@ -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);
|
||||
|
Reference in New Issue
Block a user