diff options
Diffstat (limited to 'net/packet/af_packet.c')
| -rw-r--r-- | net/packet/af_packet.c | 10 | 
1 files changed, 7 insertions, 3 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index a74650e98f42..5dda263b4a0a 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -1965,7 +1965,7 @@ retry:  	skb->mark = sk->sk_mark;  	skb->tstamp = sockc.transmit_time; -	sock_tx_timestamp(sk, sockc.tsflags, &skb_shinfo(skb)->tx_flags); +	skb_setup_tx_timestamp(skb, sockc.tsflags);  	if (unlikely(extra_len == 4))  		skb->no_fcs = 1; @@ -2460,7 +2460,7 @@ static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb,  	skb->priority = po->sk.sk_priority;  	skb->mark = po->sk.sk_mark;  	skb->tstamp = sockc->transmit_time; -	sock_tx_timestamp(&po->sk, sockc->tsflags, &skb_shinfo(skb)->tx_flags); +	skb_setup_tx_timestamp(skb, sockc->tsflags);  	skb_zcopy_set_nouarg(skb, ph.raw);  	skb_reserve(skb, hlen); @@ -2627,6 +2627,8 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)  		proto	= saddr->sll_protocol;  		addr	= saddr->sll_addr;  		dev = dev_get_by_index(sock_net(&po->sk), saddr->sll_ifindex); +		if (addr && dev && saddr->sll_halen < dev->addr_len) +			goto out;  	}  	err = -ENXIO; @@ -2825,6 +2827,8 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)  		proto	= saddr->sll_protocol;  		addr	= saddr->sll_addr;  		dev = dev_get_by_index(sock_net(sk), saddr->sll_ifindex); +		if (addr && dev && saddr->sll_halen < dev->addr_len) +			goto out;  	}  	err = -ENXIO; @@ -2898,7 +2902,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)  		goto out_free;  	} -	sock_tx_timestamp(sk, sockc.tsflags, &skb_shinfo(skb)->tx_flags); +	skb_setup_tx_timestamp(skb, sockc.tsflags);  	if (!vnet_hdr.gso_type && (len > dev->mtu + reserve + extra_len) &&  	    !packet_extra_vlan_len_allowed(dev, skb)) {  | 
