From: sashiko-bot@kernel.org
To: "Tapio Reijonen" <tapio.reijonen@vaisala.com>
Cc: linux-serial@vger.kernel.org
Subject: Re: [PATCH v6 5/9] serial: max310x: wait for TX to drain before powering down in shutdown
Date: Sun, 04 Oct 2026 12:28:35 +0000 [thread overview]
Message-ID: <20261004122835.92E741F000FF@smtp.kernel.org> (raw)
In-Reply-To: <20261004-max310x-rs485-sw-delay-v6-5-3a0ef13ed9e3@vaisala.com>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] serial: max310x: DoS via uninterruptible sleep in max310x_shutdown()
--
commit 418c89d1dd7ac6d2979824452f69b97e06892699
Author: Tapio Reijonen <tapio.reijonen@vaisala.com>
serial: max310x: wait for TX to drain before powering down in shutdown
This patch waits for the TX FIFO to drain before powering down the port
in max310x_shutdown(), calculating the per-character sleep duration
based on the configured baud rate.
> diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
> index 2456a2af891f5..9dcc817b97945 100644
> --- a/drivers/tty/serial/max310x.c
> +++ b/drivers/tty/serial/max310x.c
[ ... ]
> @@ -1124,10 +1126,13 @@ static void max310x_set_termios(struct uart_port *port,
> uart_update_timeout(port, termios->c_cflag, baud);
>
> /*
> - * Cache the new baud rate and reprogram the RS485 RTS delays, whose
> - * millisecond-to-bit-time conversion depends on it.
> + * Cache the new baud rate and the time it takes to clock out one
> + * character before reprogramming the RS485 RTS delays: the
> + * millisecond-to-bit-time conversion divides by the baud rate.
> */
> to_max310x_port(port)->baud = baud;
> + to_max310x_port(port)->char_time_us =
> + DIV_ROUND_UP(USEC_PER_SEC * frame_bits, baud);
[Severity: High]
Does this calculation create a dangerously large sleep duration at extremely
low baud rates?
If a user configures a very low baud rate (e.g., 50 baud or even 1 baud), this
value becomes extremely large since it scales inversely with the baud rate.
> max310x_set_rts_ctl_params(to_max310x_port(port));
> }
>
> @@ -1223,6 +1228,22 @@ static int max310x_startup(struct uart_port *port)
>
> static void max310x_shutdown(struct uart_port *port)
> {
> + struct max310x_one *one = to_max310x_port(port);
> + unsigned int tries = port->fifosize + 1;
> +
> + /*
> + * The tty layer's wait-until-sent is bounded by closing_wait, which
> + * can be configured to none, and a hangup reaches here with no wait
> + * at all, so the FIFO may still hold anything up to its full size.
> + * tx_empty() also only reflects the chip TX FIFO - the last character
> + * may still be in the transmit shift register. Let the FIFO drain and
> + * the final character clock out before the port is powered down,
> + * otherwise the transfer is truncated on the wire.
> + */
> + while (!max310x_tx_empty(port) && tries-- > 0)
> + fsleep(one->char_time_us);
> + fsleep(one->char_time_us);
[Severity: High]
Can this loop be used to cause a local Denial of Service via an extended
D-state hang or Hung Task Panic?
If a user opens the TTY, configures a very low baud rate (e.g., speed 1-50),
disables CTS flow control (preventing the TX FIFO from draining), and closes
the device, max310x_shutdown() could call fsleep() up to 129 times in
TASK_UNINTERRUPTIBLE.
At 50 baud, char_time_us is 200,000, causing a 25.8 second uninterruptible
sleep per close(). At 1 baud, this sleep duration exceeds 20 minutes, which
would trigger the kernel's hung_task_panic. Even without a panic, the
extended D-state sleep holds the TTY port mutex, blocking system services
like udev or other users from accessing the port.
> +
> /* Disable all interrupts */
> max310x_port_write(port, MAX310X_IRQEN_REG, 0);
>
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261004-max310x-rs485-sw-delay-v6-0-3a0ef13ed9e3@vaisala.com?part=5
next prev parent reply other threads:[~2026-10-04 12:28 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-04 12:16 [PATCH v6 0/9] serial: max310x: RS485 delay and RTS fixes, software-timed delays Tapio Reijonen
2026-10-04 12:16 ` [PATCH v6 1/9] serial: max310x: don't clobber the TX break bit in set_termios Tapio Reijonen
2026-10-04 12:23 ` sashiko-bot
2026-10-05 15:45 ` Hugo Villeneuve
2026-10-04 12:16 ` [PATCH v6 2/9] serial: max310x: assert the transceiver during a break Tapio Reijonen
2026-10-04 12:33 ` sashiko-bot
2026-10-04 12:16 ` [PATCH v6 3/9] serial: max310x: centralize the RS485 transceiver programming Tapio Reijonen
2026-10-04 12:24 ` sashiko-bot
2026-10-04 12:16 ` [PATCH v6 4/9] serial: max310x: convert RS485 delays from milliseconds to bit-times Tapio Reijonen
2026-10-04 12:30 ` sashiko-bot
2026-10-04 12:16 ` [PATCH v6 5/9] serial: max310x: wait for TX to drain before powering down in shutdown Tapio Reijonen
2026-10-04 12:28 ` sashiko-bot [this message]
2026-10-05 10:12 ` Maarten Brock
2026-10-05 10:51 ` Tapio Reijonen
2026-10-04 12:16 ` [PATCH v6 6/9] serial: max310x: support active-low RTS on the hardware path Tapio Reijonen
2026-10-04 12:25 ` sashiko-bot
2026-10-04 12:16 ` [PATCH v6 7/9] serial: max310x: schedule tx_work directly from the IRQ handler Tapio Reijonen
2026-10-04 12:24 ` sashiko-bot
2026-10-04 12:16 ` [PATCH v6 8/9] serial: max310x: drive RTS in software when hardware delays are too short Tapio Reijonen
2026-10-04 12:31 ` sashiko-bot
2026-10-04 12:16 ` [PATCH v6 9/9] serial: max310x: don't transmit while an RS485 reconfigure is pending Tapio Reijonen
2026-10-04 12:31 ` sashiko-bot
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=20261004122835.92E741F000FF@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=tapio.reijonen@vaisala.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox