• Kostya B's avatar
    [IPv4] UFO: prevent generation of chained skb destined to UFO device · be9164e7
    Kostya B authored
    Problem: ip_append_data() could wrongly generate a chained skb for
    devices which support UFO.  When sk_write_queue is not empty
    (e.g. MSG_MORE), __instead__ of appending data into the next nr_frag
    of the queued skb, a new chained skb is created.
    
    I would normally assume UFO device should get data in nr_frags and not
    in frag_list.  Later the udp4_hwcsum_outgoing() resets csum to NONE
    and skb_gso_segment() has oops.
    
    Proposal:
    1. Even length is less than mtu, employ ip_ufo_append_data()
    and append data to the __existed__ skb in the sk_write_queue.
    
    2. ip_ufo_append_data() is fixed due to a wrong manipulation of
    peek-ing and later enqueue-ing of the same skb.  Now, enqueuing is
    always performed, because on error the further
    ip_flush_pending_frames() would release the queued skb.
    Signed-off-by: default avatarKostya B <bkostya@hotmail.com>
    Acked-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    be9164e7
ip_output.c 34.9 KB