Commit 5f2d68b6 authored by Florian Westphal's avatar Florian Westphal Committed by Greg Kroah-Hartman

ipv6: defrag: drop non-last frags smaller than min mtu

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 <>
Cc: Eric Dumazet <>
Signed-off-by: default avatarFlorian Westphal <>
Signed-off-by: default avatarDavid S. Miller <>
Signed-off-by: default avatarMao Wenan <>
[bwh: Backported to 4.4: In nf_ct_frag6_gather() use clone instead of skb,
 and goto ret_orig in case of error]
Signed-off-by: default avatarBen Hutchings <>
Signed-off-by: default avatarGreg Kroah-Hartman <>
parent 26cfea3c
......@@ -574,6 +574,10 @@ struct sk_buff *nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 use
hdr = ipv6_hdr(clone);
fhdr = (struct frag_hdr *)skb_transport_header(clone);
if (clone->len - skb_network_offset(clone) < IPV6_MIN_MTU &&
fhdr->frag_off & htons(IP6_MF))
goto ret_orig;
fq = fq_find(net, fhdr->identification, user, hdr,
skb->dev ? skb->dev->ifindex : 0);
......@@ -515,6 +515,10 @@ static int ipv6_frag_rcv(struct sk_buff *skb)
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) {
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment