Skip to content

Commit

Permalink
tun: Fix crash with non-GSO users
Browse files Browse the repository at this point in the history
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: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Herbert Xu authored and David S. Miller committed Apr 14, 2009
1 parent 86bceba commit 0eca93b
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions drivers/net/tun.c
Original file line number Diff line number Diff line change
Expand Up @@ -518,7 +518,7 @@ static inline struct sk_buff *tun_alloc_skb(struct tun_struct *tun,
int err;

/* Under a page? Don't bother with paged skb. */
if (prepad + len < PAGE_SIZE)
if (prepad + len < PAGE_SIZE || !linear)
linear = len;

skb = sock_alloc_send_pskb(sk, prepad + linear, len - linear, noblock,
Expand Down Expand Up @@ -565,7 +565,8 @@ static __inline__ ssize_t tun_get_user(struct tun_struct *tun,

if ((tun->flags & TUN_TYPE_MASK) == TUN_TAP_DEV) {
align = NET_IP_ALIGN;
if (unlikely(len < ETH_HLEN))
if (unlikely(len < ETH_HLEN ||
(gso.hdr_len && gso.hdr_len < ETH_HLEN)))
return -EINVAL;
}

Expand Down

0 comments on commit 0eca93b

Please sign in to comment.