diff options
author | David S. Miller <davem@davemloft.net> | 2017-10-05 17:57:03 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-10-05 18:19:22 -0700 |
commit | 53954cf8c5d205624167a2bfd117cc0c1a5f3c6d (patch) | |
tree | a287f0c80eb616758bb5212523c8fb3d8fc350a4 /net/packet | |
parent | 4b54db1375757aa3e870c075065a8ab9350d26c4 (diff) | |
parent | 7a92616c0bac849e790283723b36c399668a1d9f (diff) | |
download | lwn-53954cf8c5d205624167a2bfd117cc0c1a5f3c6d.tar.gz lwn-53954cf8c5d205624167a2bfd117cc0c1a5f3c6d.zip |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Just simple overlapping changes.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/packet')
-rw-r--r-- | net/packet/af_packet.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index b0f221885dfd..3f5caa3fbd06 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -2838,6 +2838,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) struct virtio_net_hdr vnet_hdr = { 0 }; int offset = 0; struct packet_sock *po = pkt_sk(sk); + bool has_vnet_hdr = false; int hlen, tlen, linear; int extra_len = 0; @@ -2881,6 +2882,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) err = packet_snd_vnet_parse(msg, &len, &vnet_hdr); if (err) goto out_unlock; + has_vnet_hdr = true; } if (unlikely(sock_flag(sk, SOCK_NOFCS))) { @@ -2939,7 +2941,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) skb->priority = sk->sk_priority; skb->mark = sockc.mark; - if (po->has_vnet_hdr) { + if (has_vnet_hdr) { err = virtio_net_hdr_to_skb(skb, &vnet_hdr, vio_le()); if (err) goto out_free; @@ -3067,13 +3069,15 @@ static int packet_do_bind(struct sock *sk, const char *name, int ifindex, int ret = 0; bool unlisted = false; - if (po->fanout) - return -EINVAL; - lock_sock(sk); spin_lock(&po->bind_lock); rcu_read_lock(); + if (po->fanout) { + ret = -EINVAL; + goto out_unlock; + } + if (name) { dev = dev_get_by_name_rcu(sock_net(sk), name); if (!dev) { |