diff options
Diffstat (limited to 'patches/linux-2.6.16.32/net-gso-1-check-dodgy.patch')
-rw-r--r-- | patches/linux-2.6.16.32/net-gso-1-check-dodgy.patch | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/patches/linux-2.6.16.32/net-gso-1-check-dodgy.patch b/patches/linux-2.6.16.32/net-gso-1-check-dodgy.patch new file mode 100644 index 0000000000..db2ea2321b --- /dev/null +++ b/patches/linux-2.6.16.32/net-gso-1-check-dodgy.patch @@ -0,0 +1,27 @@ +diff -pruN ../orig-linux-2.6.16.29/net/ipv4/tcp.c ./net/ipv4/tcp.c +--- ../orig-linux-2.6.16.29/net/ipv4/tcp.c 2006-09-19 13:59:20.000000000 +0100 ++++ ./net/ipv4/tcp.c 2006-09-19 13:59:42.000000000 +0100 +@@ -2042,13 +2042,19 @@ struct sk_buff *tcp_tso_segment(struct s + if (!pskb_may_pull(skb, thlen)) + goto out; + +- segs = NULL; +- if (skb_gso_ok(skb, features | NETIF_F_GSO_ROBUST)) +- goto out; +- + oldlen = (u16)~skb->len; + __skb_pull(skb, thlen); + ++ if (skb_gso_ok(skb, features | NETIF_F_GSO_ROBUST)) { ++ /* Packet is from an untrusted source, reset gso_segs. */ ++ int mss = skb_shinfo(skb)->gso_size; ++ ++ skb_shinfo(skb)->gso_segs = (skb->len + mss - 1) / mss; ++ ++ segs = NULL; ++ goto out; ++ } ++ + segs = skb_segment(skb, features); + if (IS_ERR(segs)) + goto out; |