* [PATCH net 02/19] can: esd_usb: kill anchored URBs before freeing netdevs
[not found] <20260716155528.809908-1-mkl@pengutronix.de>
@ 2026-07-16 15:47 ` Marc Kleine-Budde
[not found] ` <20260716155528.809908-4-mkl@pengutronix.de>
1 sibling, 0 replies; 5+ messages in thread
From: Marc Kleine-Budde @ 2026-07-16 15:47 UTC (permalink / raw)
To: netdev; +Cc: davem, kuba, linux-can, kernel, Fan Wu, stable, Marc Kleine-Budde
From: Fan Wu <fanwu01@zju.edu.cn>
esd_usb_disconnect() frees each CAN netdev with free_candev() inside
its per-netdev loop and only calls unlink_all_urbs(dev) afterwards.
The per-netdev private data (struct esd_usb_net_priv) is embedded in
the net_device allocation returned by alloc_candev(), so once
free_candev() has run, dev->nets[i] points to freed memory.
unlink_all_urbs() then dereferences the freed dev->nets[i] to kill the
per-netdev TX anchor (usb_kill_anchored_urbs(&priv->tx_submitted)),
clear active_tx_jobs, and reset priv->tx_contexts[].
Reorder the teardown so the anchored URBs are killed before the netdevs
are freed, matching other CAN/USB drivers in the same directory such as
ems_usb, usb_8dev and mcba_usb, which unregister, then unlink, then
free: unregister the netdevs first (which stops their TX queues), call
unlink_all_urbs(dev) once, then free the netdevs.
This issue was found by an in-house static analysis tool.
Fixes: 96d8e90382dc ("can: Add driver for esd CAN-USB/2 device")
Cc: stable@vger.kernel.org
Assisted-by: Codex:gpt-5.5
Signed-off-by: Fan Wu <fanwu01@zju.edu.cn>
Link: https://patch.msgid.link/20260709164159.497640-1-fanwu01@zju.edu.cn
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
drivers/net/can/usb/esd_usb.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/net/can/usb/esd_usb.c b/drivers/net/can/usb/esd_usb.c
index d257440fa01f..f41d4a0d140f 100644
--- a/drivers/net/can/usb/esd_usb.c
+++ b/drivers/net/can/usb/esd_usb.c
@@ -1390,10 +1390,13 @@ static void esd_usb_disconnect(struct usb_interface *intf)
netdev = dev->nets[i]->netdev;
netdev_info(netdev, "unregister\n");
unregister_netdev(netdev);
- free_candev(netdev);
}
}
unlink_all_urbs(dev);
+ for (i = 0; i < dev->net_count; i++) {
+ if (dev->nets[i])
+ free_candev(dev->nets[i]->netdev);
+ }
kfree(dev);
}
}
--
2.53.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH net 03/19] can: raw: add locking for raw flags bitfield
[not found] ` <20260716155528.809908-4-mkl@pengutronix.de>
@ 2026-07-26 8:08 ` Oliver Hartkopp
2026-07-26 11:17 ` Greg KH
0 siblings, 1 reply; 5+ messages in thread
From: Oliver Hartkopp @ 2026-07-26 8:08 UTC (permalink / raw)
To: stable@vger.kernel.org; +Cc: Vincent Mailhol, Marc Kleine-Budde
Upstream commit 1e5185c090589f4146d728ab36417d8a5419f127
is missing in stable.
Best regards,
Oliver
On 16.07.26 17:47, Marc Kleine-Budde wrote:
> From: Oliver Hartkopp <socketcan@hartkopp.net>
>
> With commit 890e5198a6e5 ("can: raw: use bitfields to store flags in
> struct raw_sock") the formerly separate integer values have been integrated
> into a single bitfield. This led to a read-modify-write operation when
> changing a flag in raw_setsockopt() which now needs a locking to prevent
> concurrent access.
>
> Instead of adding a lock/unlock hell in each of the flag manipulations this
> patch introduces a wrapper for a new raw_setsockopt_locked() function
> analogue to the isotp_setsockopt[_locked]() approach in net/can/isotp.c
>
> Fixes: 890e5198a6e5 ("can: raw: use bitfields to store flags in struct raw_sock")
> Reported-by: Eulgyu Kim <eulgyukim@snu.ac.kr>
> Closes: https://lore.kernel.org/linux-can/20260503112200.22727-1-eulgyukim@snu.ac.kr/
> Tested-by: Eulgyu Kim <eulgyukim@snu.ac.kr>
> Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
> Reviewed-by: Vincent Mailhol <mailhol@kernel.org>
> Tested-by: Vincent Mailhol <mailhol@kernel.org>
> Link: https://patch.msgid.link/20260504111928.41856-1-socketcan@hartkopp.net
> [mkl: use Closes tag instead of Link]
> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
> ---
> net/can/raw.c | 66 +++++++++++++++++++++++----------------------------
> 1 file changed, 30 insertions(+), 36 deletions(-)
>
> diff --git a/net/can/raw.c b/net/can/raw.c
> index a26942e78e68..82d9c0499c95 100644
> --- a/net/can/raw.c
> +++ b/net/can/raw.c
> @@ -562,8 +562,8 @@ static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
> return RAW_MIN_NAMELEN;
> }
>
> -static int raw_setsockopt(struct socket *sock, int level, int optname,
> - sockptr_t optval, unsigned int optlen)
> +static int raw_setsockopt_locked(struct socket *sock, int optname,
> + sockptr_t optval, unsigned int optlen)
> {
> struct sock *sk = sock->sk;
> struct raw_sock *ro = raw_sk(sk);
> @@ -575,9 +575,6 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
> int flag;
> int err = 0;
>
> - if (level != SOL_CAN_RAW)
> - return -EINVAL;
> -
> switch (optname) {
> case CAN_RAW_FILTER:
> if (optlen % sizeof(struct can_filter) != 0)
> @@ -598,17 +595,11 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
> return -EFAULT;
> }
>
> - rtnl_lock();
> - lock_sock(sk);
> -
> dev = ro->dev;
> - if (ro->bound && dev) {
> - if (dev->reg_state != NETREG_REGISTERED) {
> - if (count > 1)
> - kfree(filter);
> - err = -ENODEV;
> - goto out_fil;
> - }
> + if (ro->bound && dev && dev->reg_state != NETREG_REGISTERED) {
> + if (count > 1)
> + kfree(filter);
> + return -ENODEV;
> }
>
> if (ro->bound) {
> @@ -622,7 +613,7 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
> if (err) {
> if (count > 1)
> kfree(filter);
> - goto out_fil;
> + return err;
> }
>
> /* remove old filter registrations */
> @@ -642,11 +633,6 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
> }
> ro->filter = filter;
> ro->count = count;
> -
> - out_fil:
> - release_sock(sk);
> - rtnl_unlock();
> -
> break;
>
> case CAN_RAW_ERR_FILTER:
> @@ -658,16 +644,9 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
>
> err_mask &= CAN_ERR_MASK;
>
> - rtnl_lock();
> - lock_sock(sk);
> -
> dev = ro->dev;
> - if (ro->bound && dev) {
> - if (dev->reg_state != NETREG_REGISTERED) {
> - err = -ENODEV;
> - goto out_err;
> - }
> - }
> + if (ro->bound && dev && dev->reg_state != NETREG_REGISTERED)
> + return -ENODEV;
>
> /* remove current error mask */
> if (ro->bound) {
> @@ -676,7 +655,7 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
> err_mask);
>
> if (err)
> - goto out_err;
> + return err;
>
> /* remove old err_mask registration */
> raw_disable_errfilter(sock_net(sk), dev, sk,
> @@ -685,11 +664,6 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
>
> /* link new err_mask to the socket */
> ro->err_mask = err_mask;
> -
> - out_err:
> - release_sock(sk);
> - rtnl_unlock();
> -
> break;
>
> case CAN_RAW_LOOPBACK:
> @@ -769,6 +743,26 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
> return err;
> }
>
> +static int raw_setsockopt(struct socket *sock, int level, int optname,
> + sockptr_t optval, unsigned int optlen)
> +{
> + struct sock *sk = sock->sk;
> + int err;
> +
> + if (level != SOL_CAN_RAW)
> + return -EINVAL;
> +
> + rtnl_lock();
> + lock_sock(sk);
> +
> + err = raw_setsockopt_locked(sock, optname, optval, optlen);
> +
> + release_sock(sk);
> + rtnl_unlock();
> +
> + return err;
> +}
> +
> static int raw_getsockopt(struct socket *sock, int level, int optname,
> sockopt_t *opt)
> {
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net 03/19] can: raw: add locking for raw flags bitfield
2026-07-26 8:08 ` [PATCH net 03/19] can: raw: add locking for raw flags bitfield Oliver Hartkopp
@ 2026-07-26 11:17 ` Greg KH
2026-07-26 19:45 ` Oliver Hartkopp
0 siblings, 1 reply; 5+ messages in thread
From: Greg KH @ 2026-07-26 11:17 UTC (permalink / raw)
To: Oliver Hartkopp
Cc: stable@vger.kernel.org, Vincent Mailhol, Marc Kleine-Budde
On Sun, Jul 26, 2026 at 10:08:52AM +0200, Oliver Hartkopp wrote:
> Upstream commit 1e5185c090589f4146d728ab36417d8a5419f127
>
> is missing in stable.
Which stable? And why wasn't this tagged for stable inclusion to start
with?
thanks,
greg k-h
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net 03/19] can: raw: add locking for raw flags bitfield
2026-07-26 11:17 ` Greg KH
@ 2026-07-26 19:45 ` Oliver Hartkopp
2026-07-27 3:59 ` Greg KH
0 siblings, 1 reply; 5+ messages in thread
From: Oliver Hartkopp @ 2026-07-26 19:45 UTC (permalink / raw)
To: Greg KH; +Cc: stable@vger.kernel.org, Vincent Mailhol, Marc Kleine-Budde
On 26.07.26 13:17, Greg KH wrote:
> On Sun, Jul 26, 2026 at 10:08:52AM +0200, Oliver Hartkopp wrote:
>> Upstream commit 1e5185c090589f4146d728ab36417d8a5419f127
>>
>> is missing in stable.
>
> Which stable? And why wasn't this tagged for stable inclusion to start
> with?
This patch fixes commit 890e5198a6e5b238627c245fafea1a92670a86cd ("can:
raw: use bitfields to store flags in struct raw_sock") introduced in 6.18:
$ git tag --contains 890e5198a6e5b238627c245fafea1a92670a86cd | head -1
v6.18
So it would be needed for 6.18 and never.
I thought the tag
Fixes: 890e5198a6e5 ("can: raw: use bitfields to store flags in struct
raw_sock")
would automatically tag this patch for stable with AUTOSEL.
Unfortunately there was no Cc: stable in the commit message. No idea why.
Best regards,
Oliver
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net 03/19] can: raw: add locking for raw flags bitfield
2026-07-26 19:45 ` Oliver Hartkopp
@ 2026-07-27 3:59 ` Greg KH
0 siblings, 0 replies; 5+ messages in thread
From: Greg KH @ 2026-07-27 3:59 UTC (permalink / raw)
To: Oliver Hartkopp
Cc: stable@vger.kernel.org, Vincent Mailhol, Marc Kleine-Budde
On Sun, Jul 26, 2026 at 09:45:09PM +0200, Oliver Hartkopp wrote:
>
>
> On 26.07.26 13:17, Greg KH wrote:
> > On Sun, Jul 26, 2026 at 10:08:52AM +0200, Oliver Hartkopp wrote:
> > > Upstream commit 1e5185c090589f4146d728ab36417d8a5419f127
> > >
> > > is missing in stable.
> >
> > Which stable? And why wasn't this tagged for stable inclusion to start
> > with?
>
> This patch fixes commit 890e5198a6e5b238627c245fafea1a92670a86cd ("can: raw:
> use bitfields to store flags in struct raw_sock") introduced in 6.18:
>
> $ git tag --contains 890e5198a6e5b238627c245fafea1a92670a86cd | head -1
> v6.18
>
> So it would be needed for 6.18 and never.
>
> I thought the tag
>
> Fixes: 890e5198a6e5 ("can: raw: use bitfields to store flags in struct
> raw_sock")
>
> would automatically tag this patch for stable with AUTOSEL.
Never rely on AUTOSEL if you know you want a patch merged, please just
follow the documentation for how to get a stable patch merged:
https://www.kernel.org/doc/html/latest/process/stable-kernel-rules.html
thanks,
greg k-h
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-07-27 4:00 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20260716155528.809908-1-mkl@pengutronix.de>
2026-07-16 15:47 ` [PATCH net 02/19] can: esd_usb: kill anchored URBs before freeing netdevs Marc Kleine-Budde
[not found] ` <20260716155528.809908-4-mkl@pengutronix.de>
2026-07-26 8:08 ` [PATCH net 03/19] can: raw: add locking for raw flags bitfield Oliver Hartkopp
2026-07-26 11:17 ` Greg KH
2026-07-26 19:45 ` Oliver Hartkopp
2026-07-27 3:59 ` Greg KH
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox