diff options
Diffstat (limited to 'net/packet/af_packet.c')
| -rw-r--r-- | net/packet/af_packet.c | 9 |
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)) |
