diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2008-04-12 21:49:30 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-04-12 21:49:30 -0400 |
commit | e01bf1c83332c4653ffd30eed20a94a9c83d82b2 (patch) | |
tree | bb39605cba8ced4b5cc3f0aca63b345ec02e29a9 /drivers/net/tun.c | |
parent | 14daa02139dcb3193b2b0250c0720a23ef610c49 (diff) |
net: check for underlength tap writes
If the user gives a packet under 14 bytes, we'll end up reading off the end
of the skb (not oopsing, just reading off the end).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Acked-by: Max Krasnyanskiy <maxk@qualcomm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/tun.c')
-rw-r--r-- | drivers/net/tun.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 970ec4793442..5b5d87585d91 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
@@ -286,8 +286,11 @@ static __inline__ ssize_t tun_get_user(struct tun_struct *tun, struct iovec *iv, | |||
286 | return -EFAULT; | 286 | return -EFAULT; |
287 | } | 287 | } |
288 | 288 | ||
289 | if ((tun->flags & TUN_TYPE_MASK) == TUN_TAP_DEV) | 289 | if ((tun->flags & TUN_TYPE_MASK) == TUN_TAP_DEV) { |
290 | align = NET_IP_ALIGN; | 290 | align = NET_IP_ALIGN; |
291 | if (unlikely(len < ETH_HLEN)) | ||
292 | return -EINVAL; | ||
293 | } | ||
291 | 294 | ||
292 | if (!(skb = alloc_skb(len + align, GFP_KERNEL))) { | 295 | if (!(skb = alloc_skb(len + align, GFP_KERNEL))) { |
293 | tun->dev->stats.rx_dropped++; | 296 | tun->dev->stats.rx_dropped++; |