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

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

    From: Florian Westphal <fw@strlen.de>

    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>
    (cherry picked from commit 0ed4229b08c13c84a3c301a08defdc9e7f4467e6)
    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
    @@ -564,6 +564,10 @@ int nf_ct_frag6_gather(struct net *net,
    hdr = ipv6_hdr(skb);
    fhdr = (struct frag_hdr *)skb_transport_header(skb);

    + if (skb->len - skb_network_offset(skb) < IPV6_MIN_MTU &&
    + fhdr->frag_off & htons(IP6_MF))
    + return -EINVAL;
    +
    skb_orphan(skb);
    fq = fq_find(net, fhdr->identification, user, hdr,
    skb->dev ? skb->dev->ifindex : 0);
    --- a/net/ipv6/reassembly.c
    +++ b/net/ipv6/reassembly.c
    @@ -516,6 +516,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;
    +
    iif = skb->dev ? skb->dev->ifindex : 0;
    fq = fq_find(net, fhdr->identification, hdr, iif);
    if (fq) {

    \
     
     \ /
      Last update: 2018-10-16 19:28    [W:4.040 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site