summaryrefslogtreecommitdiffstats
path: root/net/tipc/msg.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/tipc/msg.c')
-rw-r--r--net/tipc/msg.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/net/tipc/msg.c b/net/tipc/msg.c
index 26d38b3d8760..5b47468739e7 100644
--- a/net/tipc/msg.c
+++ b/net/tipc/msg.c
@@ -565,18 +565,22 @@ bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, int *err)
565/* tipc_msg_reassemble() - clone a buffer chain of fragments and 565/* tipc_msg_reassemble() - clone a buffer chain of fragments and
566 * reassemble the clones into one message 566 * reassemble the clones into one message
567 */ 567 */
568struct sk_buff *tipc_msg_reassemble(struct sk_buff_head *list) 568bool tipc_msg_reassemble(struct sk_buff_head *list, struct sk_buff_head *rcvq)
569{ 569{
570 struct sk_buff *skb; 570 struct sk_buff *skb, *_skb;
571 struct sk_buff *frag = NULL; 571 struct sk_buff *frag = NULL;
572 struct sk_buff *head = NULL; 572 struct sk_buff *head = NULL;
573 int hdr_sz; 573 int hdr_len;
574 574
575 /* Copy header if single buffer */ 575 /* Copy header if single buffer */
576 if (skb_queue_len(list) == 1) { 576 if (skb_queue_len(list) == 1) {
577 skb = skb_peek(list); 577 skb = skb_peek(list);
578 hdr_sz = skb_headroom(skb) + msg_hdr_sz(buf_msg(skb)); 578 hdr_len = skb_headroom(skb) + msg_hdr_sz(buf_msg(skb));
579 return __pskb_copy(skb, hdr_sz, GFP_ATOMIC); 579 _skb = __pskb_copy(skb, hdr_len, GFP_ATOMIC);
580 if (!_skb)
581 return false;
582 __skb_queue_tail(rcvq, _skb);
583 return true;
580 } 584 }
581 585
582 /* Clone all fragments and reassemble */ 586 /* Clone all fragments and reassemble */
@@ -590,11 +594,12 @@ struct sk_buff *tipc_msg_reassemble(struct sk_buff_head *list)
590 if (!head) 594 if (!head)
591 goto error; 595 goto error;
592 } 596 }
593 return frag; 597 __skb_queue_tail(rcvq, frag);
598 return true;
594error: 599error:
595 pr_warn("Failed do clone local mcast rcv buffer\n"); 600 pr_warn("Failed do clone local mcast rcv buffer\n");
596 kfree_skb(head); 601 kfree_skb(head);
597 return NULL; 602 return false;
598} 603}
599 604
600/* tipc_skb_queue_sorted(); sort pkt into list according to sequence number 605/* tipc_skb_queue_sorted(); sort pkt into list according to sequence number