diff options
Diffstat (limited to 'udp-consistently-apply-ufo-or-fragmentation.patch')
-rw-r--r-- | udp-consistently-apply-ufo-or-fragmentation.patch | 93 |
1 files changed, 0 insertions, 93 deletions
diff --git a/udp-consistently-apply-ufo-or-fragmentation.patch b/udp-consistently-apply-ufo-or-fragmentation.patch deleted file mode 100644 index 63e089b6e..000000000 --- a/udp-consistently-apply-ufo-or-fragmentation.patch +++ /dev/null @@ -1,93 +0,0 @@ -From 85f1bd9a7b5a79d5baa8bf44af19658f7bf77bfa Mon Sep 17 00:00:00 2001 -From: Willem de Bruijn <willemb@google.com> -Date: Thu, 10 Aug 2017 12:29:19 -0400 -Subject: udp: consistently apply ufo or fragmentation - -When iteratively building a UDP datagram with MSG_MORE and that -datagram exceeds MTU, consistently choose UFO or fragmentation. - -Once skb_is_gso, always apply ufo. Conversely, once a datagram is -split across multiple skbs, do not consider ufo. - -Sendpage already maintains the first invariant, only add the second. -IPv6 does not have a sendpage implementation to modify. - -A gso skb must have a partial checksum, do not follow sk_no_check_tx -in udp_send_skb. - -Found by syzkaller. - -Fixes: e89e9cf539a2 ("[IPv4/IPv6]: UFO Scatter-gather approach") -Reported-by: Andrey Konovalov <andreyknvl@google.com> -Signed-off-by: Willem de Bruijn <willemb@google.com> -Signed-off-by: David S. Miller <davem@davemloft.net> ---- - net/ipv4/ip_output.c | 8 +++++--- - net/ipv4/udp.c | 2 +- - net/ipv6/ip6_output.c | 7 ++++--- - 3 files changed, 10 insertions(+), 7 deletions(-) - -diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c -index 50c74cd..e153c40 100644 ---- a/net/ipv4/ip_output.c -+++ b/net/ipv4/ip_output.c -@@ -965,11 +965,12 @@ static int __ip_append_data(struct sock *sk, - csummode = CHECKSUM_PARTIAL; - - cork->length += length; -- if ((((length + (skb ? skb->len : fragheaderlen)) > mtu) || -- (skb && skb_is_gso(skb))) && -+ if ((skb && skb_is_gso(skb)) || -+ (((length + (skb ? skb->len : fragheaderlen)) > mtu) && -+ (skb_queue_len(queue) <= 1) && - (sk->sk_protocol == IPPROTO_UDP) && - (rt->dst.dev->features & NETIF_F_UFO) && !dst_xfrm(&rt->dst) && -- (sk->sk_type == SOCK_DGRAM) && !sk->sk_no_check_tx) { -+ (sk->sk_type == SOCK_DGRAM) && !sk->sk_no_check_tx)) { - err = ip_ufo_append_data(sk, queue, getfrag, from, length, - hh_len, fragheaderlen, transhdrlen, - maxfraglen, flags); -@@ -1288,6 +1289,7 @@ ssize_t ip_append_page(struct sock *sk, struct flowi4 *fl4, struct page *page, - return -EINVAL; - - if ((size + skb->len > mtu) && -+ (skb_queue_len(&sk->sk_write_queue) == 1) && - (sk->sk_protocol == IPPROTO_UDP) && - (rt->dst.dev->features & NETIF_F_UFO)) { - if (skb->ip_summed != CHECKSUM_PARTIAL) -diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c -index e6276fa..a7c804f 100644 ---- a/net/ipv4/udp.c -+++ b/net/ipv4/udp.c -@@ -802,7 +802,7 @@ static int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4) - if (is_udplite) /* UDP-Lite */ - csum = udplite_csum(skb); - -- else if (sk->sk_no_check_tx) { /* UDP csum disabled */ -+ else if (sk->sk_no_check_tx && !skb_is_gso(skb)) { /* UDP csum off */ - - skb->ip_summed = CHECKSUM_NONE; - goto send; -diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c -index 162efba..2dfe50d 100644 ---- a/net/ipv6/ip6_output.c -+++ b/net/ipv6/ip6_output.c -@@ -1381,11 +1381,12 @@ emsgsize: - */ - - cork->length += length; -- if ((((length + (skb ? skb->len : headersize)) > mtu) || -- (skb && skb_is_gso(skb))) && -+ if ((skb && skb_is_gso(skb)) || -+ (((length + (skb ? skb->len : headersize)) > mtu) && -+ (skb_queue_len(queue) <= 1) && - (sk->sk_protocol == IPPROTO_UDP) && - (rt->dst.dev->features & NETIF_F_UFO) && !dst_xfrm(&rt->dst) && -- (sk->sk_type == SOCK_DGRAM) && !udp_get_no_check6_tx(sk)) { -+ (sk->sk_type == SOCK_DGRAM) && !udp_get_no_check6_tx(sk))) { - err = ip6_ufo_append_data(sk, queue, getfrag, from, length, - hh_len, fragheaderlen, exthdrlen, - transhdrlen, mtu, flags, fl6); --- -cgit v1.1 - |