|
@@ -248,8 +248,7 @@ static void ip_expire(unsigned long arg)
|
|
|
if (!head->dev)
|
|
|
goto out_rcu_unlock;
|
|
|
|
|
|
- /* skb dst is stale, drop it, and perform route lookup again */
|
|
|
- skb_dst_drop(head);
|
|
|
+ /* skb has no dst, perform route lookup again */
|
|
|
iph = ip_hdr(head);
|
|
|
err = ip_route_input_noref(head, iph->daddr, iph->saddr,
|
|
|
iph->tos, head->dev);
|
|
@@ -523,9 +522,16 @@ found:
|
|
|
qp->q.max_size = skb->len + ihl;
|
|
|
|
|
|
if (qp->q.last_in == (INET_FRAG_FIRST_IN | INET_FRAG_LAST_IN) &&
|
|
|
- qp->q.meat == qp->q.len)
|
|
|
- return ip_frag_reasm(qp, prev, dev);
|
|
|
+ qp->q.meat == qp->q.len) {
|
|
|
+ unsigned long orefdst = skb->_skb_refdst;
|
|
|
|
|
|
+ skb->_skb_refdst = 0UL;
|
|
|
+ err = ip_frag_reasm(qp, prev, dev);
|
|
|
+ skb->_skb_refdst = orefdst;
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+
|
|
|
+ skb_dst_drop(skb);
|
|
|
inet_frag_lru_move(&qp->q);
|
|
|
return -EINPROGRESS;
|
|
|
|