diff options
Diffstat (limited to 'net/ipv4/ip_output.c')
-rw-r--r-- | net/ipv4/ip_output.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 7eb252dcecee..50c74cd890bc 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -599,6 +599,7 @@ int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, | |||
599 | hlen = iph->ihl * 4; | 599 | hlen = iph->ihl * 4; |
600 | mtu = mtu - hlen; /* Size of data space */ | 600 | mtu = mtu - hlen; /* Size of data space */ |
601 | IPCB(skb)->flags |= IPSKB_FRAG_COMPLETE; | 601 | IPCB(skb)->flags |= IPSKB_FRAG_COMPLETE; |
602 | ll_rs = LL_RESERVED_SPACE(rt->dst.dev); | ||
602 | 603 | ||
603 | /* When frag_list is given, use it. First, check its validity: | 604 | /* When frag_list is given, use it. First, check its validity: |
604 | * some transformers could create wrong frag_list or break existing | 605 | * some transformers could create wrong frag_list or break existing |
@@ -614,14 +615,15 @@ int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, | |||
614 | if (first_len - hlen > mtu || | 615 | if (first_len - hlen > mtu || |
615 | ((first_len - hlen) & 7) || | 616 | ((first_len - hlen) & 7) || |
616 | ip_is_fragment(iph) || | 617 | ip_is_fragment(iph) || |
617 | skb_cloned(skb)) | 618 | skb_cloned(skb) || |
619 | skb_headroom(skb) < ll_rs) | ||
618 | goto slow_path; | 620 | goto slow_path; |
619 | 621 | ||
620 | skb_walk_frags(skb, frag) { | 622 | skb_walk_frags(skb, frag) { |
621 | /* Correct geometry. */ | 623 | /* Correct geometry. */ |
622 | if (frag->len > mtu || | 624 | if (frag->len > mtu || |
623 | ((frag->len & 7) && frag->next) || | 625 | ((frag->len & 7) && frag->next) || |
624 | skb_headroom(frag) < hlen) | 626 | skb_headroom(frag) < hlen + ll_rs) |
625 | goto slow_path_clean; | 627 | goto slow_path_clean; |
626 | 628 | ||
627 | /* Partially cloned skb? */ | 629 | /* Partially cloned skb? */ |
@@ -711,8 +713,6 @@ slow_path: | |||
711 | left = skb->len - hlen; /* Space per frame */ | 713 | left = skb->len - hlen; /* Space per frame */ |
712 | ptr = hlen; /* Where to start from */ | 714 | ptr = hlen; /* Where to start from */ |
713 | 715 | ||
714 | ll_rs = LL_RESERVED_SPACE(rt->dst.dev); | ||
715 | |||
716 | /* | 716 | /* |
717 | * Fragment the datagram. | 717 | * Fragment the datagram. |
718 | */ | 718 | */ |