diff options
author | Eric Dumazet <edumazet@google.com> | 2014-04-15 12:58:34 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-04-15 12:58:34 -0400 |
commit | b0270e91014dabfceaf37f5b40ad51bbf21a1302 (patch) | |
tree | 6bebc58cf422a4493d306a1a6fd658d0f02a411e /net/ipv4/ip_output.c | |
parent | 1dd333f470b4e1767c9c0a14b05b5104e56b2930 (diff) |
ipv4: add a sock pointer to ip_queue_xmit()
ip_queue_xmit() assumes the skb it has to transmit is attached to an
inet socket. Commit 31c70d5956fc ("l2tp: keep original skb ownership")
changed l2tp to not change skb ownership and thus broke this assumption.
One fix is to add a new 'struct sock *sk' parameter to ip_queue_xmit(),
so that we do not assume skb->sk points to the socket used by l2tp
tunnel.
Fixes: 31c70d5956fc ("l2tp: keep original skb ownership")
Reported-by: Zhan Jianyu <nasa4836@gmail.com>
Tested-by: Zhan Jianyu <nasa4836@gmail.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/ip_output.c')
-rw-r--r-- | net/ipv4/ip_output.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 1a0755fea491..7ad68b860935 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -315,9 +315,9 @@ static void ip_copy_addrs(struct iphdr *iph, const struct flowi4 *fl4) | |||
315 | sizeof(fl4->saddr) + sizeof(fl4->daddr)); | 315 | sizeof(fl4->saddr) + sizeof(fl4->daddr)); |
316 | } | 316 | } |
317 | 317 | ||
318 | int ip_queue_xmit(struct sk_buff *skb, struct flowi *fl) | 318 | /* Note: skb->sk can be different from sk, in case of tunnels */ |
319 | int ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl) | ||
319 | { | 320 | { |
320 | struct sock *sk = skb->sk; | ||
321 | struct inet_sock *inet = inet_sk(sk); | 321 | struct inet_sock *inet = inet_sk(sk); |
322 | struct ip_options_rcu *inet_opt; | 322 | struct ip_options_rcu *inet_opt; |
323 | struct flowi4 *fl4; | 323 | struct flowi4 *fl4; |
@@ -389,6 +389,7 @@ packet_routed: | |||
389 | ip_select_ident_more(skb, &rt->dst, sk, | 389 | ip_select_ident_more(skb, &rt->dst, sk, |
390 | (skb_shinfo(skb)->gso_segs ?: 1) - 1); | 390 | (skb_shinfo(skb)->gso_segs ?: 1) - 1); |
391 | 391 | ||
392 | /* TODO : should we use skb->sk here instead of sk ? */ | ||
392 | skb->priority = sk->sk_priority; | 393 | skb->priority = sk->sk_priority; |
393 | skb->mark = sk->sk_mark; | 394 | skb->mark = sk->sk_mark; |
394 | 395 | ||