lkml.org 
[lkml]   [2019]   [Feb]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 60/65] ipv6: defrag: drop non-last frags smaller than min mtu
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Florian Westphal <fw@strlen.de>

    commit 0ed4229b08c13c84a3c301a08defdc9e7f4467e6 upstream.

    don't bother with pathological cases, they only waste cycles.
    IPv6 requires a minimum MTU of 1280 so we should never see fragments
    smaller than this (except last frag).

    v3: don't use awkward "-offset + len"
    v2: drop IPv4 part, which added same check w. IPV4_MIN_MTU (68).
    There were concerns that there could be even smaller frags
    generated by intermediate nodes, e.g. on radio networks.

    Cc: Peter Oskolkov <posk@google.com>
    Cc: Eric Dumazet <edumazet@google.com>
    Signed-off-by: Florian Westphal <fw@strlen.de>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Mao Wenan <maowenan@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/ipv6/netfilter/nf_conntrack_reasm.c | 4 ++++
    net/ipv6/reassembly.c | 4 ++++
    2 files changed, 8 insertions(+)

    --- a/net/ipv6/netfilter/nf_conntrack_reasm.c
    +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c
    @@ -602,6 +602,10 @@ struct sk_buff *nf_ct_frag6_gather(struc
    hdr = ipv6_hdr(clone);
    fhdr = (struct frag_hdr *)skb_transport_header(clone);

    + if (skb->len - skb_network_offset(skb) < IPV6_MIN_MTU &&
    + fhdr->frag_off & htons(IP6_MF))
    + goto ret_orig;
    +
    skb_orphan(skb);
    fq = fq_find(net, fhdr->identification, user, &hdr->saddr, &hdr->daddr,
    skb->dev ? skb->dev->ifindex : 0, ip6_frag_ecn(hdr));
    --- a/net/ipv6/reassembly.c
    +++ b/net/ipv6/reassembly.c
    @@ -549,6 +549,10 @@ static int ipv6_frag_rcv(struct sk_buff
    return 1;
    }

    + if (skb->len - skb_network_offset(skb) < IPV6_MIN_MTU &&
    + fhdr->frag_off & htons(IP6_MF))
    + goto fail_hdr;
    +
    fq = fq_find(net, fhdr->identification, &hdr->saddr, &hdr->daddr,
    skb->dev ? skb->dev->ifindex : 0, ip6_frag_ecn(hdr));
    if (fq) {

    \
     
     \ /
      Last update: 2019-02-04 12:08    [W:3.655 / U:0.384 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site