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 1fd784f3e2ec..dd309626ae9a 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
| @@ -534,7 +534,9 @@ static void udp_v6_flush_pending_frames(struct sock *sk) | |||
| 534 | { | 534 | { |
| 535 | struct udp_sock *up = udp_sk(sk); | 535 | struct udp_sock *up = udp_sk(sk); |
| 536 | 536 | ||
| 537 | if (up->pending) { | 537 | if (up->pending == AF_INET) |
| 538 | udp_flush_pending_frames(sk); | ||
| 539 | else if (up->pending) { | ||
| 538 | up->len = 0; | 540 | up->len = 0; |
| 539 | up->pending = 0; | 541 | up->pending = 0; |
| 540 | ip6_flush_pending_frames(sk); | 542 | ip6_flush_pending_frames(sk); |
| @@ -731,7 +733,7 @@ do_udp_sendmsg: | |||
| 731 | memset(opt, 0, sizeof(struct ipv6_txoptions)); | 733 | memset(opt, 0, sizeof(struct ipv6_txoptions)); |
| 732 | opt->tot_len = sizeof(*opt); | 734 | opt->tot_len = sizeof(*opt); |
| 733 | 735 | ||
| 734 | err = datagram_send_ctl(msg, &fl, opt, &hlimit, &tclass); | 736 | err = datagram_send_ctl(sock_net(sk), msg, &fl, opt, &hlimit, &tclass); |
| 735 | if (err < 0) { | 737 | if (err < 0) { |
| 736 | fl6_sock_release(flowlabel); | 738 | fl6_sock_release(flowlabel); |
| 737 | return err; | 739 | return err; |
| @@ -848,12 +850,14 @@ do_append_data: | |||
| 848 | } else { | 850 | } else { |
| 849 | dst_release(dst); | 851 | dst_release(dst); |
| 850 | } | 852 | } |
| 853 | dst = NULL; | ||
| 851 | } | 854 | } |
| 852 | 855 | ||
| 853 | if (err > 0) | 856 | if (err > 0) |
| 854 | err = np->recverr ? net_xmit_errno(err) : 0; | 857 | err = np->recverr ? net_xmit_errno(err) : 0; |
| 855 | release_sock(sk); | 858 | release_sock(sk); |
| 856 | out: | 859 | out: |
| 860 | dst_release(dst); | ||
| 857 | fl6_sock_release(flowlabel); | 861 | fl6_sock_release(flowlabel); |
| 858 | if (!err) | 862 | if (!err) |
| 859 | return len; | 863 | return len; |
