diff options
author | David S. Miller <davem@davemloft.net> | 2019-05-02 22:14:21 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-05-02 22:14:21 -0400 |
commit | ff24e4980a68d83090a02fda081741a410fe8eef (patch) | |
tree | 4d874dfcaf2bb8c3abc2446af9447a983402c0ae /net/packet | |
parent | 26f146ed971c0e4a264ce525d7a66a71ef73690d (diff) | |
parent | ea9866793d1e925b4d320eaea409263b2a568f38 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Three trivial overlapping conflicts.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/packet')
-rw-r--r-- | net/packet/af_packet.c | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 5c4a118d6f96..90d4e3ce00e5 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -2600,8 +2600,8 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) | |||
2600 | void *ph; | 2600 | void *ph; |
2601 | DECLARE_SOCKADDR(struct sockaddr_ll *, saddr, msg->msg_name); | 2601 | DECLARE_SOCKADDR(struct sockaddr_ll *, saddr, msg->msg_name); |
2602 | bool need_wait = !(msg->msg_flags & MSG_DONTWAIT); | 2602 | bool need_wait = !(msg->msg_flags & MSG_DONTWAIT); |
2603 | unsigned char *addr = NULL; | ||
2603 | int tp_len, size_max; | 2604 | int tp_len, size_max; |
2604 | unsigned char *addr; | ||
2605 | void *data; | 2605 | void *data; |
2606 | int len_sum = 0; | 2606 | int len_sum = 0; |
2607 | int status = TP_STATUS_AVAILABLE; | 2607 | int status = TP_STATUS_AVAILABLE; |
@@ -2612,7 +2612,6 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) | |||
2612 | if (likely(saddr == NULL)) { | 2612 | if (likely(saddr == NULL)) { |
2613 | dev = packet_cached_dev_get(po); | 2613 | dev = packet_cached_dev_get(po); |
2614 | proto = po->num; | 2614 | proto = po->num; |
2615 | addr = NULL; | ||
2616 | } else { | 2615 | } else { |
2617 | err = -EINVAL; | 2616 | err = -EINVAL; |
2618 | if (msg->msg_namelen < sizeof(struct sockaddr_ll)) | 2617 | if (msg->msg_namelen < sizeof(struct sockaddr_ll)) |
@@ -2622,10 +2621,13 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) | |||
2622 | sll_addr))) | 2621 | sll_addr))) |
2623 | goto out; | 2622 | goto out; |
2624 | proto = saddr->sll_protocol; | 2623 | proto = saddr->sll_protocol; |
2625 | addr = saddr->sll_halen ? saddr->sll_addr : NULL; | ||
2626 | dev = dev_get_by_index(sock_net(&po->sk), saddr->sll_ifindex); | 2624 | dev = dev_get_by_index(sock_net(&po->sk), saddr->sll_ifindex); |
2627 | if (addr && dev && saddr->sll_halen < dev->addr_len) | 2625 | if (po->sk.sk_socket->type == SOCK_DGRAM) { |
2628 | goto out_put; | 2626 | if (dev && msg->msg_namelen < dev->addr_len + |
2627 | offsetof(struct sockaddr_ll, sll_addr)) | ||
2628 | goto out_put; | ||
2629 | addr = saddr->sll_addr; | ||
2630 | } | ||
2629 | } | 2631 | } |
2630 | 2632 | ||
2631 | err = -ENXIO; | 2633 | err = -ENXIO; |
@@ -2797,7 +2799,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) | |||
2797 | struct sk_buff *skb; | 2799 | struct sk_buff *skb; |
2798 | struct net_device *dev; | 2800 | struct net_device *dev; |
2799 | __be16 proto; | 2801 | __be16 proto; |
2800 | unsigned char *addr; | 2802 | unsigned char *addr = NULL; |
2801 | int err, reserve = 0; | 2803 | int err, reserve = 0; |
2802 | struct sockcm_cookie sockc; | 2804 | struct sockcm_cookie sockc; |
2803 | struct virtio_net_hdr vnet_hdr = { 0 }; | 2805 | struct virtio_net_hdr vnet_hdr = { 0 }; |
@@ -2814,7 +2816,6 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) | |||
2814 | if (likely(saddr == NULL)) { | 2816 | if (likely(saddr == NULL)) { |
2815 | dev = packet_cached_dev_get(po); | 2817 | dev = packet_cached_dev_get(po); |
2816 | proto = po->num; | 2818 | proto = po->num; |
2817 | addr = NULL; | ||
2818 | } else { | 2819 | } else { |
2819 | err = -EINVAL; | 2820 | err = -EINVAL; |
2820 | if (msg->msg_namelen < sizeof(struct sockaddr_ll)) | 2821 | if (msg->msg_namelen < sizeof(struct sockaddr_ll)) |
@@ -2822,10 +2823,13 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) | |||
2822 | if (msg->msg_namelen < (saddr->sll_halen + offsetof(struct sockaddr_ll, sll_addr))) | 2823 | if (msg->msg_namelen < (saddr->sll_halen + offsetof(struct sockaddr_ll, sll_addr))) |
2823 | goto out; | 2824 | goto out; |
2824 | proto = saddr->sll_protocol; | 2825 | proto = saddr->sll_protocol; |
2825 | addr = saddr->sll_halen ? saddr->sll_addr : NULL; | ||
2826 | dev = dev_get_by_index(sock_net(sk), saddr->sll_ifindex); | 2826 | dev = dev_get_by_index(sock_net(sk), saddr->sll_ifindex); |
2827 | if (addr && dev && saddr->sll_halen < dev->addr_len) | 2827 | if (sock->type == SOCK_DGRAM) { |
2828 | goto out_unlock; | 2828 | if (dev && msg->msg_namelen < dev->addr_len + |
2829 | offsetof(struct sockaddr_ll, sll_addr)) | ||
2830 | goto out_unlock; | ||
2831 | addr = saddr->sll_addr; | ||
2832 | } | ||
2829 | } | 2833 | } |
2830 | 2834 | ||
2831 | err = -ENXIO; | 2835 | err = -ENXIO; |
@@ -3342,20 +3346,29 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, | |||
3342 | sock_recv_ts_and_drops(msg, sk, skb); | 3346 | sock_recv_ts_and_drops(msg, sk, skb); |
3343 | 3347 | ||
3344 | if (msg->msg_name) { | 3348 | if (msg->msg_name) { |
3349 | int copy_len; | ||
3350 | |||
3345 | /* If the address length field is there to be filled | 3351 | /* If the address length field is there to be filled |
3346 | * in, we fill it in now. | 3352 | * in, we fill it in now. |
3347 | */ | 3353 | */ |
3348 | if (sock->type == SOCK_PACKET) { | 3354 | if (sock->type == SOCK_PACKET) { |
3349 | __sockaddr_check_size(sizeof(struct sockaddr_pkt)); | 3355 | __sockaddr_check_size(sizeof(struct sockaddr_pkt)); |
3350 | msg->msg_namelen = sizeof(struct sockaddr_pkt); | 3356 | msg->msg_namelen = sizeof(struct sockaddr_pkt); |
3357 | copy_len = msg->msg_namelen; | ||
3351 | } else { | 3358 | } else { |
3352 | struct sockaddr_ll *sll = &PACKET_SKB_CB(skb)->sa.ll; | 3359 | struct sockaddr_ll *sll = &PACKET_SKB_CB(skb)->sa.ll; |
3353 | 3360 | ||
3354 | msg->msg_namelen = sll->sll_halen + | 3361 | msg->msg_namelen = sll->sll_halen + |
3355 | offsetof(struct sockaddr_ll, sll_addr); | 3362 | offsetof(struct sockaddr_ll, sll_addr); |
3363 | copy_len = msg->msg_namelen; | ||
3364 | if (msg->msg_namelen < sizeof(struct sockaddr_ll)) { | ||
3365 | memset(msg->msg_name + | ||
3366 | offsetof(struct sockaddr_ll, sll_addr), | ||
3367 | 0, sizeof(sll->sll_addr)); | ||
3368 | msg->msg_namelen = sizeof(struct sockaddr_ll); | ||
3369 | } | ||
3356 | } | 3370 | } |
3357 | memcpy(msg->msg_name, &PACKET_SKB_CB(skb)->sa, | 3371 | memcpy(msg->msg_name, &PACKET_SKB_CB(skb)->sa, copy_len); |
3358 | msg->msg_namelen); | ||
3359 | } | 3372 | } |
3360 | 3373 | ||
3361 | if (pkt_sk(sk)->auxdata) { | 3374 | if (pkt_sk(sk)->auxdata) { |