All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.