54 lines
1.5 KiB
Diff
54 lines
1.5 KiB
Diff
From 56aae92b2a29364793e98d06e64b9eda731706b6 Mon Sep 17 00:00:00 2001
|
|
From: Cunhao Lu <1579567540@qq.com>
|
|
Date: Fri, 31 Jul 2026 17:14:38 +0800
|
|
Subject: [PATCH 2/3] can: skb: make CAN skb allocation failure paths IRQ-safe
|
|
|
|
The CAN skb allocation helpers are used from hardware interrupt receive
|
|
handlers. If can_skb_ext_add() fails, they release the newly allocated skb
|
|
with kfree_skb(), which is not safe in hardware interrupt context.
|
|
|
|
Use dev_kfree_skb_any() for the allocation failure paths in
|
|
alloc_can_skb(), alloc_canfd_skb(), and alloc_canxl_skb().
|
|
|
|
Fixes: 96ea3a1e2d31 ("can: add CAN skb extension infrastructure")
|
|
Cc: stable@vger.kernel.org
|
|
Signed-off-by: Cunhao Lu <1579567540@qq.com>
|
|
---
|
|
drivers/net/can/dev/skb.c | 6 +++---
|
|
1 file changed, 3 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/drivers/net/can/dev/skb.c b/drivers/net/can/dev/skb.c
|
|
index d7b5a5d17ff2..d34d3e7d4c9f 100644
|
|
--- a/drivers/net/can/dev/skb.c
|
|
+++ b/drivers/net/can/dev/skb.c
|
|
@@ -223,7 +223,7 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf)
|
|
|
|
csx = can_skb_ext_add(skb);
|
|
if (!csx) {
|
|
- kfree_skb(skb);
|
|
+ dev_kfree_skb_any(skb);
|
|
goto out_error_cc;
|
|
}
|
|
|
|
@@ -254,7 +254,7 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev,
|
|
|
|
csx = can_skb_ext_add(skb);
|
|
if (!csx) {
|
|
- kfree_skb(skb);
|
|
+ dev_kfree_skb_any(skb);
|
|
goto out_error_fd;
|
|
}
|
|
|
|
@@ -292,7 +292,7 @@ struct sk_buff *alloc_canxl_skb(struct net_device *dev,
|
|
|
|
csx = can_skb_ext_add(skb);
|
|
if (!csx) {
|
|
- kfree_skb(skb);
|
|
+ dev_kfree_skb_any(skb);
|
|
goto out_error_xl;
|
|
}
|
|
|
|
--
|
|
2.34.1
|
|
|