diff options
-rw-r--r-- | net/tipc/msg.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index c5ac436235e0..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 | ||