diff options
author | Alexander Drozdov <al.drozdov@gmail.com> | 2015-07-28 13:57:01 +0300 |
---|---|---|
committer | Luis Henriques <luis.henriques@canonical.com> | 2015-08-25 10:13:53 +0100 |
commit | 581823ecc47b2e0c164eccf3bf171a0c6097abd9 (patch) | |
tree | 44f20635a4d034cdbde514e949ba57d601547f38 /net | |
parent | 26b1c3fa5972853b98c97fe6065a73e0096c2024 (diff) | |
download | linux-stable-581823ecc47b2e0c164eccf3bf171a0c6097abd9.tar.gz linux-stable-581823ecc47b2e0c164eccf3bf171a0c6097abd9.tar.bz2 linux-stable-581823ecc47b2e0c164eccf3bf171a0c6097abd9.zip |
packet: tpacket_snd(): fix signed/unsigned comparison
commit dbd46ab412b8fb395f2b0ff6f6a7eec9df311550 upstream.
tpacket_fill_skb() can return a negative value (-errno) which
is stored in tp_len variable. In that case the following
condition will be (but shouldn't be) true:
tp_len > dev->mtu + dev->hard_header_len
as dev->mtu and dev->hard_header_len are both unsigned.
That may lead to just returning an incorrect EMSGSIZE errno
to the user.
Fixes: 52f1454f629fa ("packet: allow to transmit +4 byte in TX_RING slot for VLAN case")
Signed-off-by: Alexander Drozdov <al.drozdov@gmail.com>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/packet/af_packet.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 7dc6a05f09c8..1f2e7d341781 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -2284,7 +2284,8 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) tp_len = tpacket_fill_skb(po, skb, ph, dev, size_max, proto, addr, hlen); - if (tp_len > dev->mtu + dev->hard_header_len) { + if (likely(tp_len >= 0) && + tp_len > dev->mtu + dev->hard_header_len) { struct ethhdr *ehdr; /* Earlier code assumed this would be a VLAN pkt, * double-check this now that we have the actual |