diff options
Diffstat (limited to 'net/ipv6/raw.c')
| -rw-r--r-- | net/ipv6/raw.c | 8 | 
1 files changed, 6 insertions, 2 deletions
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index dc65ec198f7c..99140986e887 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c @@ -733,6 +733,7 @@ static int raw6_getfrag(void *from, char *to, int offset, int len, int odd,  static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)  { +	struct ipv6_txoptions *opt_to_free = NULL;  	struct ipv6_txoptions opt_space;  	DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name);  	struct in6_addr *daddr, *final_p, final; @@ -839,8 +840,10 @@ static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)  		if (!(opt->opt_nflen|opt->opt_flen))  			opt = NULL;  	} -	if (!opt) -		opt = np->opt; +	if (!opt) { +		opt = txopt_get(np); +		opt_to_free = opt; +		}  	if (flowlabel)  		opt = fl6_merge_options(&opt_space, flowlabel, opt);  	opt = ipv6_fixup_options(&opt_space, opt); @@ -906,6 +909,7 @@ done:  	dst_release(dst);  out:  	fl6_sock_release(flowlabel); +	txopt_put(opt_to_free);  	return err < 0 ? err : len;  do_confirm:  	dst_confirm(dst);  | 
