aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2009-06-04 00:20:51 -0400
committerDavid S. Miller <davem@davemloft.net>2009-06-04 00:20:51 -0400
commit278b2513f76161a9cf1ebddd620dc9d1714fe573 (patch)
tree948c51313b36b155fe435807ad89a8a76441e7d7
parent56c8f140719e6f62836fb645d3fd96c6289907fb (diff)
gso: Stop fraglists from escaping
As it stands skb fraglists can get past the check in dev_queue_xmit if the skb is marked as GSO. In particular, if the packet doesn't have the proper checksums for GSO, but can otherwise be handled by the underlying device, we will not perform the fraglist check on it at all. If the underlying device cannot handle fraglists, then this will break. The fix is as simple as moving the fraglist check from the device check into skb_gso_ok. This has caused crashes with Xen when used together with GRO which can generate GSO packets with fraglists. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/linux/netdevice.h5
1 files changed, 2 insertions, 3 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index bbfabf3012b6..2a801380b502 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1903,15 +1903,14 @@ static inline int net_gso_ok(int features, int gso_type)
1903 1903
1904static inline int skb_gso_ok(struct sk_buff *skb, int features) 1904static inline int skb_gso_ok(struct sk_buff *skb, int features)
1905{ 1905{
1906 return net_gso_ok(features, skb_shinfo(skb)->gso_type); 1906 return net_gso_ok(features, skb_shinfo(skb)->gso_type) &&
1907 (!skb_shinfo(skb)->frag_list || (features & NETIF_F_FRAGLIST));
1907} 1908}
1908 1909
1909static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb) 1910static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb)
1910{ 1911{
1911 return skb_is_gso(skb) && 1912 return skb_is_gso(skb) &&
1912 (!skb_gso_ok(skb, dev->features) || 1913 (!skb_gso_ok(skb, dev->features) ||
1913 (skb_shinfo(skb)->frag_list &&
1914 !(dev->features & NETIF_F_FRAGLIST)) ||
1915 unlikely(skb->ip_summed != CHECKSUM_PARTIAL)); 1914 unlikely(skb->ip_summed != CHECKSUM_PARTIAL));
1916} 1915}
1917 1916