diff options
Diffstat (limited to 'net/tipc/msg.c')
-rw-r--r-- | net/tipc/msg.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index 26d38b3d8760..8740930f0787 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c | |||
@@ -182,7 +182,6 @@ int tipc_buf_append(struct sk_buff **headbuf, struct sk_buff **buf) | |||
182 | *buf = NULL; | 182 | *buf = NULL; |
183 | return 0; | 183 | return 0; |
184 | err: | 184 | err: |
185 | pr_warn_ratelimited("Unable to build fragment list\n"); | ||
186 | kfree_skb(*buf); | 185 | kfree_skb(*buf); |
187 | kfree_skb(*headbuf); | 186 | kfree_skb(*headbuf); |
188 | *buf = *headbuf = NULL; | 187 | *buf = *headbuf = NULL; |
@@ -565,18 +564,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 | 564 | /* tipc_msg_reassemble() - clone a buffer chain of fragments and |
566 | * reassemble the clones into one message | 565 | * reassemble the clones into one message |
567 | */ | 566 | */ |
568 | struct sk_buff *tipc_msg_reassemble(struct sk_buff_head *list) | 567 | bool tipc_msg_reassemble(struct sk_buff_head *list, struct sk_buff_head *rcvq) |
569 | { | 568 | { |
570 | struct sk_buff *skb; | 569 | struct sk_buff *skb, *_skb; |
571 | struct sk_buff *frag = NULL; | 570 | struct sk_buff *frag = NULL; |
572 | struct sk_buff *head = NULL; | 571 | struct sk_buff *head = NULL; |
573 | int hdr_sz; | 572 | int hdr_len; |
574 | 573 | ||
575 | /* Copy header if single buffer */ | 574 | /* Copy header if single buffer */ |
576 | if (skb_queue_len(list) == 1) { | 575 | if (skb_queue_len(list) == 1) { |
577 | skb = skb_peek(list); | 576 | skb = skb_peek(list); |
578 | hdr_sz = skb_headroom(skb) + msg_hdr_sz(buf_msg(skb)); | 577 | hdr_len = skb_headroom(skb) + msg_hdr_sz(buf_msg(skb)); |
579 | return __pskb_copy(skb, hdr_sz, GFP_ATOMIC); | 578 | _skb = __pskb_copy(skb, hdr_len, GFP_ATOMIC); |
579 | if (!_skb) | ||
580 | return false; | ||
581 | __skb_queue_tail(rcvq, _skb); | ||
582 | return true; | ||
580 | } | 583 | } |
581 | 584 | ||
582 | /* Clone all fragments and reassemble */ | 585 | /* Clone all fragments and reassemble */ |
@@ -590,11 +593,12 @@ struct sk_buff *tipc_msg_reassemble(struct sk_buff_head *list) | |||
590 | if (!head) | 593 | if (!head) |
591 | goto error; | 594 | goto error; |
592 | } | 595 | } |
593 | return frag; | 596 | __skb_queue_tail(rcvq, frag); |
597 | return true; | ||
594 | error: | 598 | error: |
595 | pr_warn("Failed do clone local mcast rcv buffer\n"); | 599 | pr_warn("Failed do clone local mcast rcv buffer\n"); |
596 | kfree_skb(head); | 600 | kfree_skb(head); |
597 | return NULL; | 601 | return false; |
598 | } | 602 | } |
599 | 603 | ||
600 | /* tipc_skb_queue_sorted(); sort pkt into list according to sequence number | 604 | /* tipc_skb_queue_sorted(); sort pkt into list according to sequence number |