diff options
Diffstat (limited to 'net/tipc/msg.c')
-rw-r--r-- | net/tipc/msg.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index 562c926a51cc..5f73450159df 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c | |||
@@ -121,7 +121,7 @@ int tipc_buf_append(struct sk_buff **headbuf, struct sk_buff **buf) | |||
121 | { | 121 | { |
122 | struct sk_buff *head = *headbuf; | 122 | struct sk_buff *head = *headbuf; |
123 | struct sk_buff *frag = *buf; | 123 | struct sk_buff *frag = *buf; |
124 | struct sk_buff *tail; | 124 | struct sk_buff *tail = NULL; |
125 | struct tipc_msg *msg; | 125 | struct tipc_msg *msg; |
126 | u32 fragid; | 126 | u32 fragid; |
127 | int delta; | 127 | int delta; |
@@ -141,9 +141,15 @@ int tipc_buf_append(struct sk_buff **headbuf, struct sk_buff **buf) | |||
141 | if (unlikely(skb_unclone(frag, GFP_ATOMIC))) | 141 | if (unlikely(skb_unclone(frag, GFP_ATOMIC))) |
142 | goto err; | 142 | goto err; |
143 | head = *headbuf = frag; | 143 | head = *headbuf = frag; |
144 | skb_frag_list_init(head); | ||
145 | TIPC_SKB_CB(head)->tail = NULL; | ||
146 | *buf = NULL; | 144 | *buf = NULL; |
145 | TIPC_SKB_CB(head)->tail = NULL; | ||
146 | if (skb_is_nonlinear(head)) { | ||
147 | skb_walk_frags(head, tail) { | ||
148 | TIPC_SKB_CB(head)->tail = tail; | ||
149 | } | ||
150 | } else { | ||
151 | skb_frag_list_init(head); | ||
152 | } | ||
147 | return 0; | 153 | return 0; |
148 | } | 154 | } |
149 | 155 | ||
@@ -539,6 +545,7 @@ bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, int *err) | |||
539 | *err = -TIPC_ERR_NO_NAME; | 545 | *err = -TIPC_ERR_NO_NAME; |
540 | if (skb_linearize(skb)) | 546 | if (skb_linearize(skb)) |
541 | return false; | 547 | return false; |
548 | msg = buf_msg(skb); | ||
542 | if (msg_reroute_cnt(msg)) | 549 | if (msg_reroute_cnt(msg)) |
543 | return false; | 550 | return false; |
544 | dnode = addr_domain(net, msg_lookup_scope(msg)); | 551 | dnode = addr_domain(net, msg_lookup_scope(msg)); |