X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=net%2Fxfrm%2Fxfrm_policy.c;h=0d49945d0b9eed2910d39a3485c3ad0c79166d87;hb=6dd9158ae8577372aa433e6b0eae3c3d4caa5439;hp=767c74a91db32bb27f4c88b230a9d8a4bca0238a;hpb=f3411cb2b2e396a41ed3a439863f028db7140a34;p=~andy%2Flinux diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 767c74a91db..0d49945d0b9 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c @@ -1844,6 +1844,13 @@ static int xdst_queue_output(struct sk_buff *skb) struct xfrm_dst *xdst = (struct xfrm_dst *) dst; struct xfrm_policy *pol = xdst->pols[0]; struct xfrm_policy_queue *pq = &pol->polq; + const struct sk_buff *fclone = skb + 1; + + if (unlikely(skb->fclone == SKB_FCLONE_ORIG && + fclone->fclone == SKB_FCLONE_CLONE)) { + kfree_skb(skb); + return 0; + } if (pq->hold_queue.qlen > XFRM_MAX_QUEUE_LEN) { kfree_skb(skb);