diff options
Diffstat (limited to 'patches/linux-2.6.17/net-gso-1-check-dodgy.patch')
-rw-r--r-- | patches/linux-2.6.17/net-gso-1-check-dodgy.patch | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/patches/linux-2.6.17/net-gso-1-check-dodgy.patch b/patches/linux-2.6.17/net-gso-1-check-dodgy.patch new file mode 100644 index 0000000000..21ccb5987b --- /dev/null +++ b/patches/linux-2.6.17/net-gso-1-check-dodgy.patch @@ -0,0 +1,27 @@ +diff -pruN ../orig-linux-2.6.17/net/ipv4/tcp.c ./net/ipv4/tcp.c +--- ../orig-linux-2.6.17/net/ipv4/tcp.c 2007-01-08 15:21:15.000000000 +0000 ++++ ./net/ipv4/tcp.c 2007-01-08 15:24:49.000000000 +0000 +@@ -2087,13 +2087,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; |