diff options
Diffstat (limited to 'net/ipv6/udp.c')
| -rw-r--r-- | net/ipv6/udp.c | 8 | 
1 files changed, 6 insertions, 2 deletions
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 01bcb49619ee..9da3287a3923 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -1110,6 +1110,7 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)  	DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name);  	struct in6_addr *daddr, *final_p, final;  	struct ipv6_txoptions *opt = NULL; +	struct ipv6_txoptions *opt_to_free = NULL;  	struct ip6_flowlabel *flowlabel = NULL;  	struct flowi6 fl6;  	struct dst_entry *dst; @@ -1263,8 +1264,10 @@ do_udp_sendmsg:  			opt = NULL;  		connected = 0;  	} -	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); @@ -1373,6 +1376,7 @@ release_dst:  out:  	dst_release(dst);  	fl6_sock_release(flowlabel); +	txopt_put(opt_to_free);  	if (!err)  		return len;  	/*  | 
