Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -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,


	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;
	}
	}