diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 9a89b8deafae..575e19dcc017 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -279,10 +279,13 @@ EXPORT_SYMBOL(tcp_v4_connect); | |||
279 | */ | 279 | */ |
280 | void tcp_v4_mtu_reduced(struct sock *sk) | 280 | void tcp_v4_mtu_reduced(struct sock *sk) |
281 | { | 281 | { |
282 | struct dst_entry *dst; | ||
283 | struct inet_sock *inet = inet_sk(sk); | 282 | struct inet_sock *inet = inet_sk(sk); |
284 | u32 mtu = tcp_sk(sk)->mtu_info; | 283 | struct dst_entry *dst; |
284 | u32 mtu; | ||
285 | 285 | ||
286 | if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE)) | ||
287 | return; | ||
288 | mtu = tcp_sk(sk)->mtu_info; | ||
286 | dst = inet_csk_update_pmtu(sk, mtu); | 289 | dst = inet_csk_update_pmtu(sk, mtu); |
287 | if (!dst) | 290 | if (!dst) |
288 | return; | 291 | return; |
@@ -428,7 +431,8 @@ void tcp_v4_err(struct sk_buff *icmp_skb, u32 info) | |||
428 | 431 | ||
429 | switch (type) { | 432 | switch (type) { |
430 | case ICMP_REDIRECT: | 433 | case ICMP_REDIRECT: |
431 | do_redirect(icmp_skb, sk); | 434 | if (!sock_owned_by_user(sk)) |
435 | do_redirect(icmp_skb, sk); | ||
432 | goto out; | 436 | goto out; |
433 | case ICMP_SOURCE_QUENCH: | 437 | case ICMP_SOURCE_QUENCH: |
434 | /* Just silently ignore these. */ | 438 | /* Just silently ignore these. */ |