summaryrefslogtreecommitdiff
path: root/drivers/net/macsec.c
diff options
context:
space:
mode:
authorAndrew Morton <akpm@linux-foundation.org>2024-02-02 03:11:07 -0800
committerAndrew Morton <akpm@linux-foundation.org>2024-02-02 03:11:07 -0800
commit349bd87f6091ac68b8eab368ce30bcaf6d45c50e (patch)
treef3b65442c181a4c2d52a070fcfa22e70ef9b5711 /drivers/net/macsec.c
parent96204e15310c218fd9355bdcacd02fed1d18070e (diff)
parent41bccc98fb7931d63d03f326a746ac4d429c1dd3 (diff)
Merge branch 'master' into mm-hotfixes-stable
Diffstat (limited to 'drivers/net/macsec.c')
-rw-r--r--drivers/net/macsec.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c
index e34816638569..7f5426285c61 100644
--- a/drivers/net/macsec.c
+++ b/drivers/net/macsec.c
@@ -607,11 +607,26 @@ static struct sk_buff *macsec_encrypt(struct sk_buff *skb,
return ERR_PTR(-EINVAL);
}
- ret = skb_ensure_writable_head_tail(skb, dev);
- if (unlikely(ret < 0)) {
- macsec_txsa_put(tx_sa);
- kfree_skb(skb);
- return ERR_PTR(ret);
+ if (unlikely(skb_headroom(skb) < MACSEC_NEEDED_HEADROOM ||
+ skb_tailroom(skb) < MACSEC_NEEDED_TAILROOM)) {
+ struct sk_buff *nskb = skb_copy_expand(skb,
+ MACSEC_NEEDED_HEADROOM,
+ MACSEC_NEEDED_TAILROOM,
+ GFP_ATOMIC);
+ if (likely(nskb)) {
+ consume_skb(skb);
+ skb = nskb;
+ } else {
+ macsec_txsa_put(tx_sa);
+ kfree_skb(skb);
+ return ERR_PTR(-ENOMEM);
+ }
+ } else {
+ skb = skb_unshare(skb, GFP_ATOMIC);
+ if (!skb) {
+ macsec_txsa_put(tx_sa);
+ return ERR_PTR(-ENOMEM);
+ }
}
unprotected_len = skb->len;