Skip to content

Commit 3a33a19

Browse files
Jon Maloydavem330
authored andcommitted
tipc: fix memory leak of group member when peer node is lost
When a group member receives a member WITHDRAW event, this might have two reasons: either the peer member is leaving the group, or the link to the member's node has been lost. In the latter case we need to issue a DOWN event to the user right away, and let function tipc_group_filter_msg() perform delete of the member item. However, in this case we miss to change the state of the member item to MBR_LEAVING, so the member item is not deleted, and we have a memory leak. We now separate better between the four sub-cases of a WITHRAW event and make sure that each case is handled correctly. Signed-off-by: Jon Maloy <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 4853f12 commit 3a33a19

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

net/tipc/group.c

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -850,17 +850,26 @@ void tipc_group_member_evt(struct tipc_group *grp,
850850
*usr_wakeup = true;
851851
m->usr_pending = false;
852852
node_up = tipc_node_is_up(net, node);
853-
854-
/* Hold back event if more messages might be expected */
855-
if (m->state != MBR_LEAVING && node_up) {
856-
m->event_msg = skb;
857-
tipc_group_decr_active(grp, m);
858-
m->state = MBR_LEAVING;
859-
} else {
860-
if (node_up)
853+
m->event_msg = NULL;
854+
855+
if (node_up) {
856+
/* Hold back event if a LEAVE msg should be expected */
857+
if (m->state != MBR_LEAVING) {
858+
m->event_msg = skb;
859+
tipc_group_decr_active(grp, m);
860+
m->state = MBR_LEAVING;
861+
} else {
861862
msg_set_grp_bc_seqno(hdr, m->bc_syncpt);
862-
else
863+
__skb_queue_tail(inputq, skb);
864+
}
865+
} else {
866+
if (m->state != MBR_LEAVING) {
867+
tipc_group_decr_active(grp, m);
868+
m->state = MBR_LEAVING;
863869
msg_set_grp_bc_seqno(hdr, m->bc_rcv_nxt);
870+
} else {
871+
msg_set_grp_bc_seqno(hdr, m->bc_syncpt);
872+
}
864873
__skb_queue_tail(inputq, skb);
865874
}
866875
list_del_init(&m->list);

0 commit comments

Comments
 (0)