aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/tipc/bcast.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c
index d9d848d488ee..e5f3da507823 100644
--- a/net/tipc/bcast.c
+++ b/net/tipc/bcast.c
@@ -611,6 +611,7 @@ static int tipc_bcbearer_send(struct sk_buff *buf,
611 struct tipc_bearer *p = bcbearer->bpairs[bp_index].primary; 611 struct tipc_bearer *p = bcbearer->bpairs[bp_index].primary;
612 struct tipc_bearer *s = bcbearer->bpairs[bp_index].secondary; 612 struct tipc_bearer *s = bcbearer->bpairs[bp_index].secondary;
613 struct tipc_bearer *b = p; 613 struct tipc_bearer *b = p;
614 struct sk_buff *tbuf;
614 615
615 if (!p) 616 if (!p)
616 break; /* No more bearers to try */ 617 break; /* No more bearers to try */
@@ -626,7 +627,17 @@ static int tipc_bcbearer_send(struct sk_buff *buf,
626 if (bcbearer->remains_new.count == bcbearer->remains.count) 627 if (bcbearer->remains_new.count == bcbearer->remains.count)
627 continue; /* Nothing added by bearer pair */ 628 continue; /* Nothing added by bearer pair */
628 629
629 tipc_bearer_send(b, buf, &b->bcast_addr); 630 if (bp_index == 0) {
631 /* Use original buffer for first bearer */
632 tipc_bearer_send(b, buf, &b->bcast_addr);
633 } else {
634 /* Avoid concurrent buffer access */
635 tbuf = pskb_copy(buf, GFP_ATOMIC);
636 if (!tbuf)
637 break;
638 tipc_bearer_send(b, tbuf, &b->bcast_addr);
639 kfree_skb(tbuf); /* Bearer keeps a clone */
640 }
630 641
631 /* Swap bearers for next packet */ 642 /* Swap bearers for next packet */
632 if (s) { 643 if (s) {