aboutsummaryrefslogtreecommitdiffstats
path: root/net/packet/af_packet.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/packet/af_packet.c')
-rw-r--r--net/packet/af_packet.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index eedacdebcd4c..1cd1d83a4be0 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -2628,7 +2628,7 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
2628 addr = saddr->sll_halen ? saddr->sll_addr : NULL; 2628 addr = saddr->sll_halen ? saddr->sll_addr : NULL;
2629 dev = dev_get_by_index(sock_net(&po->sk), saddr->sll_ifindex); 2629 dev = dev_get_by_index(sock_net(&po->sk), saddr->sll_ifindex);
2630 if (addr && dev && saddr->sll_halen < dev->addr_len) 2630 if (addr && dev && saddr->sll_halen < dev->addr_len)
2631 goto out; 2631 goto out_put;
2632 } 2632 }
2633 2633
2634 err = -ENXIO; 2634 err = -ENXIO;
@@ -2828,7 +2828,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
2828 addr = saddr->sll_halen ? saddr->sll_addr : NULL; 2828 addr = saddr->sll_halen ? saddr->sll_addr : NULL;
2829 dev = dev_get_by_index(sock_net(sk), saddr->sll_ifindex); 2829 dev = dev_get_by_index(sock_net(sk), saddr->sll_ifindex);
2830 if (addr && dev && saddr->sll_halen < dev->addr_len) 2830 if (addr && dev && saddr->sll_halen < dev->addr_len)
2831 goto out; 2831 goto out_unlock;
2832 } 2832 }
2833 2833
2834 err = -ENXIO; 2834 err = -ENXIO;
@@ -2887,7 +2887,8 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
2887 goto out_free; 2887 goto out_free;
2888 } else if (reserve) { 2888 } else if (reserve) {
2889 skb_reserve(skb, -reserve); 2889 skb_reserve(skb, -reserve);
2890 if (len < reserve) 2890 if (len < reserve + sizeof(struct ipv6hdr) &&
2891 dev->min_header_len != dev->hard_header_len)
2891 skb_reset_network_header(skb); 2892 skb_reset_network_header(skb);
2892 } 2893 }
2893 2894
@@ -4291,7 +4292,7 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u,
4291 rb->frames_per_block = req->tp_block_size / req->tp_frame_size; 4292 rb->frames_per_block = req->tp_block_size / req->tp_frame_size;
4292 if (unlikely(rb->frames_per_block == 0)) 4293 if (unlikely(rb->frames_per_block == 0))
4293 goto out; 4294 goto out;
4294 if (unlikely(req->tp_block_size > UINT_MAX / req->tp_block_nr)) 4295 if (unlikely(rb->frames_per_block > UINT_MAX / req->tp_block_nr))
4295 goto out; 4296 goto out;
4296 if (unlikely((rb->frames_per_block * req->tp_block_nr) != 4297 if (unlikely((rb->frames_per_block * req->tp_block_nr) !=
4297 req->tp_frame_nr)) 4298 req->tp_frame_nr))