diff options
Diffstat (limited to 'net/ipv6/udp.c')
| -rw-r--r-- | net/ipv6/udp.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 52b8347ae3b2..3c0c9c755c92 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
| @@ -583,16 +583,20 @@ static void flush_stack(struct sock **stack, unsigned int count, | |||
| 583 | bh_lock_sock(sk); | 583 | bh_lock_sock(sk); |
| 584 | if (!sock_owned_by_user(sk)) | 584 | if (!sock_owned_by_user(sk)) |
| 585 | udpv6_queue_rcv_skb(sk, skb1); | 585 | udpv6_queue_rcv_skb(sk, skb1); |
| 586 | else | 586 | else if (sk_add_backlog(sk, skb1)) { |
| 587 | sk_add_backlog(sk, skb1); | 587 | kfree_skb(skb1); |
| 588 | bh_unlock_sock(sk); | ||
| 589 | goto drop; | ||
| 590 | } | ||
| 588 | bh_unlock_sock(sk); | 591 | bh_unlock_sock(sk); |
| 589 | } else { | 592 | continue; |
| 590 | atomic_inc(&sk->sk_drops); | ||
| 591 | UDP6_INC_STATS_BH(sock_net(sk), | ||
| 592 | UDP_MIB_RCVBUFERRORS, IS_UDPLITE(sk)); | ||
| 593 | UDP6_INC_STATS_BH(sock_net(sk), | ||
| 594 | UDP_MIB_INERRORS, IS_UDPLITE(sk)); | ||
| 595 | } | 593 | } |
| 594 | drop: | ||
| 595 | atomic_inc(&sk->sk_drops); | ||
| 596 | UDP6_INC_STATS_BH(sock_net(sk), | ||
| 597 | UDP_MIB_RCVBUFERRORS, IS_UDPLITE(sk)); | ||
| 598 | UDP6_INC_STATS_BH(sock_net(sk), | ||
| 599 | UDP_MIB_INERRORS, IS_UDPLITE(sk)); | ||
| 596 | } | 600 | } |
| 597 | } | 601 | } |
| 598 | /* | 602 | /* |
| @@ -754,8 +758,12 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, | |||
| 754 | bh_lock_sock(sk); | 758 | bh_lock_sock(sk); |
| 755 | if (!sock_owned_by_user(sk)) | 759 | if (!sock_owned_by_user(sk)) |
| 756 | udpv6_queue_rcv_skb(sk, skb); | 760 | udpv6_queue_rcv_skb(sk, skb); |
| 757 | else | 761 | else if (sk_add_backlog(sk, skb)) { |
| 758 | sk_add_backlog(sk, skb); | 762 | atomic_inc(&sk->sk_drops); |
| 763 | bh_unlock_sock(sk); | ||
| 764 | sock_put(sk); | ||
| 765 | goto discard; | ||
| 766 | } | ||
| 759 | bh_unlock_sock(sk); | 767 | bh_unlock_sock(sk); |
| 760 | sock_put(sk); | 768 | sock_put(sk); |
| 761 | return 0; | 769 | return 0; |
