Commit 3a33a19b authored by Jon Maloy's avatar Jon Maloy Committed by David S. Miller

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: default avatarJon Maloy <jon.maloy@ericsson.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4853f128
...@@ -850,17 +850,26 @@ void tipc_group_member_evt(struct tipc_group *grp, ...@@ -850,17 +850,26 @@ void tipc_group_member_evt(struct tipc_group *grp,
*usr_wakeup = true; *usr_wakeup = true;
m->usr_pending = false; m->usr_pending = false;
node_up = tipc_node_is_up(net, node); node_up = tipc_node_is_up(net, node);
m->event_msg = NULL;
/* Hold back event if more messages might be expected */
if (m->state != MBR_LEAVING && node_up) { if (node_up) {
m->event_msg = skb; /* Hold back event if a LEAVE msg should be expected */
tipc_group_decr_active(grp, m); if (m->state != MBR_LEAVING) {
m->state = MBR_LEAVING; m->event_msg = skb;
} else { tipc_group_decr_active(grp, m);
if (node_up) m->state = MBR_LEAVING;
} else {
msg_set_grp_bc_seqno(hdr, m->bc_syncpt); msg_set_grp_bc_seqno(hdr, m->bc_syncpt);
else __skb_queue_tail(inputq, skb);
}
} else {
if (m->state != MBR_LEAVING) {
tipc_group_decr_active(grp, m);
m->state = MBR_LEAVING;
msg_set_grp_bc_seqno(hdr, m->bc_rcv_nxt); msg_set_grp_bc_seqno(hdr, m->bc_rcv_nxt);
} else {
msg_set_grp_bc_seqno(hdr, m->bc_syncpt);
}
__skb_queue_tail(inputq, skb); __skb_queue_tail(inputq, skb);
} }
list_del_init(&m->list); list_del_init(&m->list);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment