From: Oleksij Rempel <o.rempel@pengutronix.de>
To: "Hölzl, Alexander" <alexander.hoelzl@gmx.net>
Cc: netdev-bot+sashiko@kernel.org, robin@protonic.nl,
linux-kernel@vger.kernel.org, kernel@pengutronix.de,
linux-can@vger.kernel.org, kuba@kernel.org
Subject: Re: [PATCH v3] can: j1939: fix potential race condition in BAM segmentation
Date: Tue, 13 Oct 2026 12:36:39 +0200 [thread overview]
Message-ID: <as4JtwJObdkyUvZF@pengutronix.de> (raw)
In-Reply-To: <fda0ca77-ecfe-4f95-a469-05cbc416944a@gmx.net>
On Tue, Oct 13, 2026 at 11:35:24AM +0200, Hölzl, Alexander wrote:
> > [Severity: Medium]
> > Could this cancel then re-arm sequence leak session references if two DT
> > frames for the same BAM session are processed at the same time?
> >
> > j1939_tp_schedule_txtimer() always takes a reference:
> >
> > j1939_session_get(session);
> > hrtimer_start(&session->txtimer, ms_to_ktime(msec),
> > HRTIMER_MODE_REL_SOFT);
> >
> > Nothing serialises j1939_xtp_rx_dat_one() calls for the same session.
> > j1939_session_get_by_addr() holds active_session_list_lock only during the
> > lookup.
> >
> > Two CPUs could handle TP.DT frames for this session at once. One example is
> > the af_can loopback netif_rx() for a device without IFF_ECHO, racing a
> > frame from the bus or an injected one. Another is two CAN_RAW injectors on
> > vcan. The interleaving would be:
> >
> > CPU1 CPU2
> > j1939_session_txtimer_cancel()
> > hrtimer_cancel() == 1, put
> > j1939_session_txtimer_cancel()
> > hrtimer_cancel() == 0
> > j1939_tp_schedule_txtimer()
> > j1939_session_get()
> > hrtimer_start()
> > j1939_tp_schedule_txtimer()
> > j1939_session_get()
> > hrtimer_start()
> >
> > When the timer fires, only one reference is dropped. The rxtimer has the
> > same problem through j1939_tp_set_rxtimeout().
> >
> > A leaked session never reaches j1939_session_destroy(). Its j1939_priv
> > reference and priv_dev_tracker netdev reference are then never released,
> > and unregistering the CAN netdev would hang waiting for the device to
> > become free.
> >
> > j1939_xtp_rx_cts_one() already uses the same unlocked pattern for directed
> > sessions. Before this patch, though, the RX path never touched the txtimer
> > for BAM transmitter sessions.
> >
> This also sounds plausible, how should this be fixed? Should additional
> locks be added? The session list lock is probably not the correct one to use
> as this is a global lock over all sessions.
> Additionally is the same type of race condition then found in
> j1939_tp_set_rxtimeout? It does basically the same thing and could also be
> called concurrently while e.g. receiving a can frame and handling a timer
> callback?
>
> CPU 1 callstack:
> j1939_tp_recv -> j1939_xtp_rx_dat -> j1939_xtp_rx_dat_one ->
> j1939_tp_set_rxtimeout
>
> CPU 2 callstack:
> j1939_tp_txtimer -> j1939_xtp_txnext_transmiter -> j1939_session_tx_dat ->
> j1939_tp_set_rxtimeout
>
> Could this cause a similar leak as described above?
Can you please take a look here:
https://docs.kernel.org/dev-tools/context-analysis.html
I hope it will help to resole some of the locking issues.
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
prev parent reply other threads:[~2026-10-13 10:36 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-11 15:31 [PATCH v3] can: j1939: fix potential race condition in BAM segmentation Alexander Hölzl
2026-10-11 15:48 ` sashiko-bot
2026-10-12 7:39 ` Hölzl, Alexander
2026-10-13 4:56 ` netdev-bot+sashiko
2026-10-13 9:35 ` Hölzl, Alexander
2026-10-13 10:36 ` Oleksij Rempel [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=as4JtwJObdkyUvZF@pengutronix.de \
--to=o.rempel@pengutronix.de \
--cc=alexander.hoelzl@gmx.net \
--cc=kernel@pengutronix.de \
--cc=kuba@kernel.org \
--cc=linux-can@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev-bot+sashiko@kernel.org \
--cc=robin@protonic.nl \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.