diff options
Diffstat (limited to 'net/tipc/msg.c')
| -rw-r--r-- | net/tipc/msg.c | 11 | 
1 files changed, 8 insertions, 3 deletions
| diff --git a/net/tipc/msg.c b/net/tipc/msg.c index 8be6e94a1ca9..0a37a472c29f 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c @@ -101,9 +101,11 @@ int tipc_msg_build(struct tipc_msg *hdr, struct iovec const *msg_sect,  }  /* tipc_buf_append(): Append a buffer to the fragment list of another buffer - * Let first buffer become head buffer - * Returns 1 and sets *buf to headbuf if chain is complete, otherwise 0 - * Leaves headbuf pointer at NULL if failure + * @*headbuf: in:  NULL for first frag, otherwise value returned from prev call + *            out: set when successful non-complete reassembly, otherwise NULL + * @*buf:     in:  the buffer to append. Always defined + *            out: head buf after sucessful complete reassembly, otherwise NULL + * Returns 1 when reassembly complete, otherwise 0   */  int tipc_buf_append(struct sk_buff **headbuf, struct sk_buff **buf)  { @@ -122,6 +124,7 @@ int tipc_buf_append(struct sk_buff **headbuf, struct sk_buff **buf)  			goto out_free;  		head = *headbuf = frag;  		skb_frag_list_init(head); +		*buf = NULL;  		return 0;  	}  	if (!head) @@ -150,5 +153,7 @@ int tipc_buf_append(struct sk_buff **headbuf, struct sk_buff **buf)  out_free:  	pr_warn_ratelimited("Unable to build fragment list\n");  	kfree_skb(*buf); +	kfree_skb(*headbuf); +	*buf = *headbuf = NULL;  	return 0;  } |