diff options
Diffstat (limited to 'net/packet/af_packet.c')
-rw-r--r-- | net/packet/af_packet.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 82a6f34d39d0..d9d4970b9b07 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -1630,8 +1630,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev, | |||
1630 | if (snaplen > res) | 1630 | if (snaplen > res) |
1631 | snaplen = res; | 1631 | snaplen = res; |
1632 | 1632 | ||
1633 | if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >= | 1633 | if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf) |
1634 | (unsigned)sk->sk_rcvbuf) | ||
1635 | goto drop_n_acct; | 1634 | goto drop_n_acct; |
1636 | 1635 | ||
1637 | if (skb_shared(skb)) { | 1636 | if (skb_shared(skb)) { |
@@ -1762,8 +1761,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, | |||
1762 | if (po->tp_version <= TPACKET_V2) { | 1761 | if (po->tp_version <= TPACKET_V2) { |
1763 | if (macoff + snaplen > po->rx_ring.frame_size) { | 1762 | if (macoff + snaplen > po->rx_ring.frame_size) { |
1764 | if (po->copy_thresh && | 1763 | if (po->copy_thresh && |
1765 | atomic_read(&sk->sk_rmem_alloc) + skb->truesize | 1764 | atomic_read(&sk->sk_rmem_alloc) < sk->sk_rcvbuf) { |
1766 | < (unsigned)sk->sk_rcvbuf) { | ||
1767 | if (skb_shared(skb)) { | 1765 | if (skb_shared(skb)) { |
1768 | copy_skb = skb_clone(skb, GFP_ATOMIC); | 1766 | copy_skb = skb_clone(skb, GFP_ATOMIC); |
1769 | } else { | 1767 | } else { |
@@ -2450,8 +2448,12 @@ static int packet_do_bind(struct sock *sk, struct net_device *dev, __be16 protoc | |||
2450 | { | 2448 | { |
2451 | struct packet_sock *po = pkt_sk(sk); | 2449 | struct packet_sock *po = pkt_sk(sk); |
2452 | 2450 | ||
2453 | if (po->fanout) | 2451 | if (po->fanout) { |
2452 | if (dev) | ||
2453 | dev_put(dev); | ||
2454 | |||
2454 | return -EINVAL; | 2455 | return -EINVAL; |
2456 | } | ||
2455 | 2457 | ||
2456 | lock_sock(sk); | 2458 | lock_sock(sk); |
2457 | 2459 | ||