Hannes Frederic Sowa wrote: > Otherwise we break the contract with GSO to only pass CHECKSUM_PARTIAL > skbs down. This can easily happen with UDP+IPv4 sockets with the first > MSG_MORE write smaller than the MTU, second write is a sendfile. > > Returning -EOPNOTSUPP lets the callers fall back into normal sendmsg path, > were we calculate the checksum manually during copying. > > Commit d749c9cbffd6 ("ipv4: no CHECKSUM_PARTIAL on MSG_MORE corked > sockets") started to exposes this bug. > > Fixes: d749c9cbffd6 ("ipv4: no CHECKSUM_PARTIAL on MSG_MORE corked sockets") > Reported-by: Jiri Benc <jb...@redhat.com> > Cc: Jiri Benc <jb...@redhat.com> > Reported-by: Wakko Warner <wa...@animx.eu.org> > Cc: Wakko Warner <wa...@animx.eu.org> > Signed-off-by: Hannes Frederic Sowa <han...@stressinduktion.org>
I just tested this with 2 of my VMs. It appears to have fixed the issue. > --- > net/ipv4/ip_output.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c > index 64878efa045c13..565bf64b2b7d60 100644 > --- a/net/ipv4/ip_output.c > +++ b/net/ipv4/ip_output.c > @@ -1236,13 +1236,16 @@ ssize_t ip_append_page(struct sock *sk, struct > flowi4 *fl4, struct page *page, > if (!skb) > return -EINVAL; > > - cork->length += size; > if ((size + skb->len > mtu) && > (sk->sk_protocol == IPPROTO_UDP) && > (rt->dst.dev->features & NETIF_F_UFO)) { > + if (skb->ip_summed != CHECKSUM_PARTIAL) > + return -EOPNOTSUPP; > + > skb_shinfo(skb)->gso_size = mtu - fragheaderlen; > skb_shinfo(skb)->gso_type = SKB_GSO_UDP; > } > + cork->length += size; > > while (size > 0) { > if (skb_is_gso(skb)) { > -- > 2.5.0 > -- Microsoft has beaten Volkswagen's world record. Volkswagen only created 22 million bugs.