summaryrefslogtreecommitdiffstats
path: root/net/packet
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2019-05-02 22:14:21 -0400
committerDavid S. Miller <davem@davemloft.net>2019-05-02 22:14:21 -0400
commitff24e4980a68d83090a02fda081741a410fe8eef (patch)
tree4d874dfcaf2bb8c3abc2446af9447a983402c0ae /net/packet
parent26f146ed971c0e4a264ce525d7a66a71ef73690d (diff)
parentea9866793d1e925b4d320eaea409263b2a568f38 (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.c37
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) {