aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/ip_fragment.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/ip_fragment.c')
-rw-r--r--net/ipv4/ip_fragment.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c
index 938520668b2f..b66910aaef4d 100644
--- a/net/ipv4/ip_fragment.c
+++ b/net/ipv4/ip_fragment.c
@@ -219,8 +219,7 @@ static void ip_expire(unsigned long arg)
219 if (!head->dev) 219 if (!head->dev)
220 goto out_rcu_unlock; 220 goto out_rcu_unlock;
221 221
222 /* skb dst is stale, drop it, and perform route lookup again */ 222 /* skb has no dst, perform route lookup again */
223 skb_dst_drop(head);
224 iph = ip_hdr(head); 223 iph = ip_hdr(head);
225 err = ip_route_input_noref(head, iph->daddr, iph->saddr, 224 err = ip_route_input_noref(head, iph->daddr, iph->saddr,
226 iph->tos, head->dev); 225 iph->tos, head->dev);
@@ -494,9 +493,16 @@ found:
494 qp->q.max_size = skb->len + ihl; 493 qp->q.max_size = skb->len + ihl;
495 494
496 if (qp->q.last_in == (INET_FRAG_FIRST_IN | INET_FRAG_LAST_IN) && 495 if (qp->q.last_in == (INET_FRAG_FIRST_IN | INET_FRAG_LAST_IN) &&
497 qp->q.meat == qp->q.len) 496 qp->q.meat == qp->q.len) {
498 return ip_frag_reasm(qp, prev, dev); 497 unsigned long orefdst = skb->_skb_refdst;
499 498
499 skb->_skb_refdst = 0UL;
500 err = ip_frag_reasm(qp, prev, dev);
501 skb->_skb_refdst = orefdst;
502 return err;
503 }
504
505 skb_dst_drop(skb);
500 inet_frag_lru_move(&qp->q); 506 inet_frag_lru_move(&qp->q);
501 return -EINPROGRESS; 507 return -EINPROGRESS;
502 508