ipv4: dst_entry leak in ip_send_unicast_reply()
Subsystems (3)
PATCH 1/1 ipv4: dst_entry leak in ip_send_unicast_reply()
ip_setup_cork() called inside ip_append_data() steals dst entry from rt to cork and in case errors in __ip_append_data() nobody frees stolen dst entry
--- net/ipv4/ip_output.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
net/ipv4/ip_output.c +9 -3
@@ -1535,6 +1535,7 @@ void ip_send_unicast_reply(struct net *net, struct sk_buff *skb,struct sk_buff *nskb;struct sock *sk;struct inet_sock *inet; +int err;if (__ip_options_echo (&replyopts.opt.opt, skb, sopt))return ;
@@ -1574,8 +1575,13 @@ void ip_send_unicast_reply(struct net *net, struct sk_buff *skb,sock_net_set (sk, net);__skb_queue_head_init (&sk->sk_write_queue); sk->sk_sndbuf = sysctl_wmem_default; -ip_append_data (sk, &fl4, ip_reply_glue_bits, arg->iov->iov_base, len,0 , - &ipc, &rt,MSG_DONTWAIT ); + err =ip_append_data (sk, &fl4, ip_reply_glue_bits, arg->iov->iov_base, + len,0 , &ipc, &rt,MSG_DONTWAIT ); +if (unlikely (err)) { +ip_flush_pending_frames (sk); + goto out; + } + nskb =skb_peek (&sk->sk_write_queue);if (nskb) {if (arg->csumoffset >=0 )
@@ -1587,7 +1593,7 @@ void ip_send_unicast_reply(struct net *net, struct sk_buff *skb,skb_set_queue_mapping (nskb,skb_get_queue_mapping (skb));ip_push_pending_frames (sk, &fl4); } - +out:put_cpu_var (unicast_sock);ip_rt_put (rt);
Signature · 1 line
1.9.1
David Miller
maintainerFrom: Vasily Averin <[email protected]>
Date: Wed, 15 Oct 2014 16:24:02 +0400
Quoted 6 lines
Fixes 2e77d89b2fa8 ("net: avoid a pair of dst_hold()/dst_release() in ip_append_data()")
ip_setup_cork()called insideip_append_data()steals dst entry from rt to cork and in case errors in__ip_append_data()nobody frees stolen dst entrySigned-off-by Vasily Averin <[email protected]>
Please, in the future, put the Fixes: tag first in the list of signoffs.
Eric, please review this change, it looks good to me.
Eric Dumazet
Acked-byQuoted 5 lines · David Miller
From: Vasily Averin <[email protected]>
Date: Wed, 15 Oct 2014 16:24:02 +0400Quoted 2 lines
Fixes 2e77d89b2fa8 ("net: avoid a pair of dst_hold()/dst_release() in ip_append_data()")
Quoted 8 lines
Quoted 4 lines
ip_setup_cork()called insideip_append_data()steals dst entry from rt to cork and in case errors in__ip_append_data()nobody frees stolen dst entrySigned-off-by Vasily Averin <[email protected]>Please, in the future, put the Fixes: tag first in the list of signoffs.
Eric, please review this change, it looks good to me.
It is good indeed, thanks !
David Miller
maintainerFrom: Vasily Averin <[email protected]>
Date: Wed, 15 Oct 2014 16:24:02 +0400
Quoted 6 lines
Fixes 2e77d89b2fa8 ("net: avoid a pair of dst_hold()/dst_release() in ip_append_data()")
ip_setup_cork()called insideip_append_data()steals dst entry from rt to cork and in case errors in__ip_append_data()nobody frees stolen dst entrySigned-off-by Vasily Averin <[email protected]>
Applied and queued up for -stable, thanks everyone!