diff options
Diffstat (limited to 'net/tipc/msg.c')
-rw-r--r-- | net/tipc/msg.c | 19 |
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 | */ |
568 | struct sk_buff *tipc_msg_reassemble(struct sk_buff_head *list) | 568 | bool 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; | ||
594 | error: | 599 | error: |
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 |