diff options
author | Erik Hugne <erik.hugne@ericsson.com> | 2014-12-03 10:58:40 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-12-09 13:41:54 -0500 |
commit | 4988bb4a3f0b3b0273c21c6c52f2730f55693b42 (patch) | |
tree | 9668bf234d3b190d8010b353e54521d39f8a2d02 /net/tipc | |
parent | d9a28c5b4c9a69f3036743bed36902b45dd39f1d (diff) |
tipc: fix missing spinlock init and nullptr oops
commit 908344cdda80 ("tipc: fix bug in multicast congestion
handling") introduced two bugs with the bclink wakeup
function. This commit fixes the missing spinlock init for the
waiting_sks list. We also eliminate the race condition
between the waiting_sks length check/dequeue operations in
tipc_bclink_wakeup_users by simply removing the redundant
length check.
Signed-off-by: Erik Hugne <erik.hugne@ericsson.com>
Acked-by: Tero Aho <Tero.Aho@coriant.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc')
-rw-r--r-- | net/tipc/bcast.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c index f0761c771734..96ceefeb9daf 100644 --- a/net/tipc/bcast.c +++ b/net/tipc/bcast.c | |||
@@ -233,8 +233,11 @@ static void bclink_retransmit_pkt(u32 after, u32 to) | |||
233 | */ | 233 | */ |
234 | void tipc_bclink_wakeup_users(void) | 234 | void tipc_bclink_wakeup_users(void) |
235 | { | 235 | { |
236 | while (skb_queue_len(&bclink->link.waiting_sks)) | 236 | struct sk_buff *skb; |
237 | tipc_sk_rcv(skb_dequeue(&bclink->link.waiting_sks)); | 237 | |
238 | while ((skb = skb_dequeue(&bclink->link.waiting_sks))) | ||
239 | tipc_sk_rcv(skb); | ||
240 | |||
238 | } | 241 | } |
239 | 242 | ||
240 | /** | 243 | /** |
@@ -950,7 +953,7 @@ int tipc_bclink_init(void) | |||
950 | spin_lock_init(&bclink->lock); | 953 | spin_lock_init(&bclink->lock); |
951 | __skb_queue_head_init(&bcl->outqueue); | 954 | __skb_queue_head_init(&bcl->outqueue); |
952 | __skb_queue_head_init(&bcl->deferred_queue); | 955 | __skb_queue_head_init(&bcl->deferred_queue); |
953 | __skb_queue_head_init(&bcl->waiting_sks); | 956 | skb_queue_head_init(&bcl->waiting_sks); |
954 | bcl->next_out_no = 1; | 957 | bcl->next_out_no = 1; |
955 | spin_lock_init(&bclink->node.lock); | 958 | spin_lock_init(&bclink->node.lock); |
956 | __skb_queue_head_init(&bclink->node.waiting_sks); | 959 | __skb_queue_head_init(&bclink->node.waiting_sks); |