* [PATCH 5.10/5.15] can: hi311x: hi3110_can_ist(): fix potential use-after-free
@ 2025-01-15 9:01 Vasiliy Kovalev
2025-01-16 0:25 ` Sasha Levin
0 siblings, 1 reply; 2+ messages in thread
From: Vasiliy Kovalev @ 2025-01-15 9:01 UTC (permalink / raw)
To: stable; +Cc: linux-can, lvc-project, kovalev, Dario Binacchi,
Marc Kleine-Budde
From: Dario Binacchi <dario.binacchi@amarulasolutions.com>
[ Upstream commit 9ad86d377ef4a19c75a9c639964879a5b25a433b ]
The commit a22bd630cfff ("can: hi311x: do not report txerr and rxerr
during bus-off") removed the reporting of rxerr and txerr even in case
of correct operation (i. e. not bus-off).
The error count information added to the CAN frame after netif_rx() is
a potential use after free, since there is no guarantee that the skb
is in the same state. It might be freed or reused.
Fix the issue by postponing the netif_rx() call in case of txerr and
rxerr reporting.
Fixes: a22bd630cfff ("can: hi311x: do not report txerr and rxerr during bus-off")
Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
Link: https://patch.msgid.link/20241122221650.633981-5-dario.binacchi@amarulasolutions.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
[kovalev: changed the call order of netif_rx_ni()
according to netif_rx() of the upstream patch]
Signed-off-by: Vasiliy Kovalev <kovalev@altlinux.org>
---
Backport to fix CVE-2024-56651
Link: https://www.cve.org/CVERecord/?id=CVE-2024-56651
---
drivers/net/can/spi/hi311x.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/net/can/spi/hi311x.c b/drivers/net/can/spi/hi311x.c
index 28273e84171a25..1cdc05475cda61 100644
--- a/drivers/net/can/spi/hi311x.c
+++ b/drivers/net/can/spi/hi311x.c
@@ -673,9 +673,9 @@ static irqreturn_t hi3110_can_ist(int irq, void *dev_id)
tx_state = txerr >= rxerr ? new_state : 0;
rx_state = txerr <= rxerr ? new_state : 0;
can_change_state(net, cf, tx_state, rx_state);
- netif_rx_ni(skb);
if (new_state == CAN_STATE_BUS_OFF) {
+ netif_rx_ni(skb);
can_bus_off(net);
if (priv->can.restart_ms == 0) {
priv->force_quit = 1;
@@ -685,6 +685,7 @@ static irqreturn_t hi3110_can_ist(int irq, void *dev_id)
} else {
cf->data[6] = txerr;
cf->data[7] = rxerr;
+ netif_rx_ni(skb);
}
}
--
2.33.8
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH 5.10/5.15] can: hi311x: hi3110_can_ist(): fix potential use-after-free
2025-01-15 9:01 [PATCH 5.10/5.15] can: hi311x: hi3110_can_ist(): fix potential use-after-free Vasiliy Kovalev
@ 2025-01-16 0:25 ` Sasha Levin
0 siblings, 0 replies; 2+ messages in thread
From: Sasha Levin @ 2025-01-16 0:25 UTC (permalink / raw)
To: stable; +Cc: Vasiliy Kovalev, Sasha Levin
[ Sasha's backport helper bot ]
Hi,
The upstream commit SHA1 provided is correct: 9ad86d377ef4a19c75a9c639964879a5b25a433b
WARNING: Author mismatch between patch and upstream commit:
Backport author: Vasiliy Kovalev<kovalev@altlinux.org>
Commit author: Dario Binacchi<dario.binacchi@amarulasolutions.com>
Status in newer kernel trees:
6.12.y | Present (different SHA1: bc30b2fe8c54)
6.6.y | Present (different SHA1: 112802200944)
6.1.y | Present (different SHA1: 4ad77eb8f2e0)
5.15.y | Not found
Note: The patch differs from the upstream commit:
---
1: 9ad86d377ef4 ! 1: 6ca160114ff4 can: hi311x: hi3110_can_ist(): fix potential use-after-free
@@ Metadata
## Commit message ##
can: hi311x: hi3110_can_ist(): fix potential use-after-free
+ [ Upstream commit 9ad86d377ef4a19c75a9c639964879a5b25a433b ]
+
The commit a22bd630cfff ("can: hi311x: do not report txerr and rxerr
during bus-off") removed the reporting of rxerr and txerr even in case
of correct operation (i. e. not bus-off).
@@ Commit message
Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
Link: https://patch.msgid.link/20241122221650.633981-5-dario.binacchi@amarulasolutions.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+ [kovalev: changed the call order of netif_rx_ni()
+ according to netif_rx() of the upstream patch]
+ Signed-off-by: Vasiliy Kovalev <kovalev@altlinux.org>
## drivers/net/can/spi/hi311x.c ##
@@ drivers/net/can/spi/hi311x.c: static irqreturn_t hi3110_can_ist(int irq, void *dev_id)
tx_state = txerr >= rxerr ? new_state : 0;
rx_state = txerr <= rxerr ? new_state : 0;
can_change_state(net, cf, tx_state, rx_state);
-- netif_rx(skb);
+- netif_rx_ni(skb);
if (new_state == CAN_STATE_BUS_OFF) {
-+ netif_rx(skb);
++ netif_rx_ni(skb);
can_bus_off(net);
if (priv->can.restart_ms == 0) {
priv->force_quit = 1;
@@ drivers/net/can/spi/hi311x.c: static irqreturn_t hi3110_can_ist(int irq, void *dev_id)
- cf->can_id |= CAN_ERR_CNT;
+ } else {
cf->data[6] = txerr;
cf->data[7] = rxerr;
-+ netif_rx(skb);
++ netif_rx_ni(skb);
}
}
---
Results of testing on various branches:
| Branch | Patch Apply | Build Test |
|---------------------------|-------------|------------|
| stable/linux-5.15.y | Success | Success |
| stable/linux-5.10.y | Success | Success |
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2025-01-16 0:25 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-15 9:01 [PATCH 5.10/5.15] can: hi311x: hi3110_can_ist(): fix potential use-after-free Vasiliy Kovalev
2025-01-16 0:25 ` Sasha Levin
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.