Skip to content

Commit 340b6e5

Browse files
Richard Alpedavem330
authored andcommitted
tipc: fix broadcast wakeup contention after congestion
commit 908344c ("tipc: fix bug in multicast congestion handling") introduced a race in the broadcast link wakeup functionality. This patch eliminates this broadcast link wakeup race caused by operation on the wakeup list without proper locking. If this race hit and corrupted the list all subsequent wakeup messages would be lost, resulting in a considerable memory leak. Signed-off-by: Richard Alpe <richard.alpe@ericsson.com> Signed-off-by: Erik Hugne <erik.hugne@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 4f675eb commit 340b6e5

File tree

2 files changed

+5
-5
lines changed

2 files changed

+5
-5
lines changed

net/tipc/link.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ struct tipc_link *tipc_link_create(struct tipc_node *n_ptr,
293293
l_ptr->next_out_no = 1;
294294
__skb_queue_head_init(&l_ptr->outqueue);
295295
__skb_queue_head_init(&l_ptr->deferred_queue);
296-
__skb_queue_head_init(&l_ptr->waiting_sks);
296+
skb_queue_head_init(&l_ptr->waiting_sks);
297297

298298
link_reset_statistics(l_ptr);
299299

@@ -358,7 +358,7 @@ static bool link_schedule_user(struct tipc_link *link, u32 oport,
358358
return false;
359359
TIPC_SKB_CB(buf)->chain_sz = chain_sz;
360360
TIPC_SKB_CB(buf)->chain_imp = imp;
361-
__skb_queue_tail(&link->waiting_sks, buf);
361+
skb_queue_tail(&link->waiting_sks, buf);
362362
link->stats.link_congs++;
363363
return true;
364364
}
@@ -378,8 +378,8 @@ static void link_prepare_wakeup(struct tipc_link *link)
378378
if (pend_qsz >= link->queue_limit[TIPC_SKB_CB(skb)->chain_imp])
379379
break;
380380
pend_qsz += TIPC_SKB_CB(skb)->chain_sz;
381-
__skb_unlink(skb, &link->waiting_sks);
382-
__skb_queue_tail(&link->owner->waiting_sks, skb);
381+
skb_unlink(skb, &link->waiting_sks);
382+
skb_queue_tail(&link->owner->waiting_sks, skb);
383383
}
384384
}
385385

net/tipc/node.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ struct tipc_node *tipc_node_create(u32 addr)
115115
INIT_LIST_HEAD(&n_ptr->list);
116116
INIT_LIST_HEAD(&n_ptr->publ_list);
117117
INIT_LIST_HEAD(&n_ptr->conn_sks);
118-
__skb_queue_head_init(&n_ptr->waiting_sks);
118+
skb_queue_head_init(&n_ptr->waiting_sks);
119119
__skb_queue_head_init(&n_ptr->bclink.deferred_queue);
120120

121121
hlist_add_head_rcu(&n_ptr->hash, &node_htable[tipc_hashfn(addr)]);

0 commit comments

Comments
 (0)