|
@@ -1832,6 +1832,13 @@ static int xdst_queue_output(struct sk_buff *skb)
|
|
|
struct dst_entry *dst = skb_dst(skb);
|
|
|
struct xfrm_dst *xdst = (struct xfrm_dst *) dst;
|
|
|
struct xfrm_policy_queue *pq = &xdst->pols[0]->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);
|