diff options
Diffstat (limited to 'net/ipv6/udp.c')
-rw-r--r-- | net/ipv6/udp.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 81eb8cf8389b..fa9d988f4012 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -393,10 +393,10 @@ int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk, | |||
393 | bool slow; | 393 | bool slow; |
394 | 394 | ||
395 | if (flags & MSG_ERRQUEUE) | 395 | if (flags & MSG_ERRQUEUE) |
396 | return ipv6_recv_error(sk, msg, len); | 396 | return ipv6_recv_error(sk, msg, len, addr_len); |
397 | 397 | ||
398 | if (np->rxpmtu && np->rxopt.bits.rxpmtu) | 398 | if (np->rxpmtu && np->rxopt.bits.rxpmtu) |
399 | return ipv6_recv_rxpmtu(sk, msg, len); | 399 | return ipv6_recv_rxpmtu(sk, msg, len, addr_len); |
400 | 400 | ||
401 | try_again: | 401 | try_again: |
402 | skb = __skb_recv_datagram(sk, flags | (noblock ? MSG_DONTWAIT : 0), | 402 | skb = __skb_recv_datagram(sk, flags | (noblock ? MSG_DONTWAIT : 0), |
@@ -538,8 +538,11 @@ void __udp6_lib_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
538 | if (sk == NULL) | 538 | if (sk == NULL) |
539 | return; | 539 | return; |
540 | 540 | ||
541 | if (type == ICMPV6_PKT_TOOBIG) | 541 | if (type == ICMPV6_PKT_TOOBIG) { |
542 | if (!ip6_sk_accept_pmtu(sk)) | ||
543 | goto out; | ||
542 | ip6_sk_update_pmtu(skb, sk, info); | 544 | ip6_sk_update_pmtu(skb, sk, info); |
545 | } | ||
543 | if (type == NDISC_REDIRECT) { | 546 | if (type == NDISC_REDIRECT) { |
544 | ip6_sk_redirect(skb, sk); | 547 | ip6_sk_redirect(skb, sk); |
545 | goto out; | 548 | goto out; |
@@ -1140,7 +1143,6 @@ do_udp_sendmsg: | |||
1140 | flowlabel = fl6_sock_lookup(sk, fl6.flowlabel); | 1143 | flowlabel = fl6_sock_lookup(sk, fl6.flowlabel); |
1141 | if (flowlabel == NULL) | 1144 | if (flowlabel == NULL) |
1142 | return -EINVAL; | 1145 | return -EINVAL; |
1143 | daddr = &flowlabel->dst; | ||
1144 | } | 1146 | } |
1145 | } | 1147 | } |
1146 | 1148 | ||
@@ -1221,7 +1223,7 @@ do_udp_sendmsg: | |||
1221 | 1223 | ||
1222 | security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); | 1224 | security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); |
1223 | 1225 | ||
1224 | dst = ip6_sk_dst_lookup_flow(sk, &fl6, final_p, true); | 1226 | dst = ip6_sk_dst_lookup_flow(sk, &fl6, final_p); |
1225 | if (IS_ERR(dst)) { | 1227 | if (IS_ERR(dst)) { |
1226 | err = PTR_ERR(dst); | 1228 | err = PTR_ERR(dst); |
1227 | dst = NULL; | 1229 | dst = NULL; |