BACKPORT: udp: consistently apply ufo or fragmentation

[ Upstream commit 85f1bd9a7b5a79d5baa8bf44af19658f7bf77bfa ]

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.

The upstream patch had a merge conflict as below and I chose upstream,
hence BACKPORT.

conflict in net/ipv6/ip6_output.c:
++<<<<<<< HEAD
+      if (((length > mtu) ||
+           (skb && skb_is_gso(skb))) &&
++=======
+       if ((skb && skb_is_gso(skb)) ||
+           (((length + fragheaderlen) > mtu) &&
+           (skb_queue_len(queue) <= 1) &&
++>>>>>>> 938990d2433c... udp: consistently apply ufo or fragmentation

BUG=chromium:780783
TEST=trybot

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(cherry picked from commit 938990d2433cdecd225e1ab54a442b3ffdce1f87)
Signed-off-by: Daniel Wang <wonderfly@google.com>

Change-Id: Iacb716f20d9297119736c429d5b442ea309ed500
Reviewed-on: https://chromium-review.googlesource.com/758495
Tested-by: Daniel Wang <wonderfly@google.com>
Reviewed-by: Guenter Roeck <groeck@chromium.org>
Commit-Queue: Daniel Wang <wonderfly@google.com>
3 files changed