Commit 0eca93bc authored by Herbert Xu's avatar Herbert Xu Committed by David S. Miller

tun: Fix crash with non-GSO users

When I made the tun driver use non-linear packets as the preferred
option, it broke non-GSO users because they would end up allocating
a completely non-linear packet, which triggers a crash when we call
eth_type_trans.

This patch reverts non-GSO users to using linear packets and adds
a check to ensure that GSO users can't cause crashes in the same
way.
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 86bcebaf
...@@ -518,7 +518,7 @@ static inline struct sk_buff *tun_alloc_skb(struct tun_struct *tun, ...@@ -518,7 +518,7 @@ static inline struct sk_buff *tun_alloc_skb(struct tun_struct *tun,
int err; int err;
/* Under a page? Don't bother with paged skb. */ /* Under a page? Don't bother with paged skb. */
if (prepad + len < PAGE_SIZE) if (prepad + len < PAGE_SIZE || !linear)
linear = len; linear = len;
skb = sock_alloc_send_pskb(sk, prepad + linear, len - linear, noblock, skb = sock_alloc_send_pskb(sk, prepad + linear, len - linear, noblock,
...@@ -565,7 +565,8 @@ static __inline__ ssize_t tun_get_user(struct tun_struct *tun, ...@@ -565,7 +565,8 @@ static __inline__ ssize_t tun_get_user(struct tun_struct *tun,
if ((tun->flags & TUN_TYPE_MASK) == TUN_TAP_DEV) { if ((tun->flags & TUN_TYPE_MASK) == TUN_TAP_DEV) {
align = NET_IP_ALIGN; align = NET_IP_ALIGN;
if (unlikely(len < ETH_HLEN)) if (unlikely(len < ETH_HLEN ||
(gso.hdr_len && gso.hdr_len < ETH_HLEN)))
return -EINVAL; return -EINVAL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment