forked from Minki/linux
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: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
86bcebafc5
commit
0eca93bcf7
@ -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,
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user