Re: [PATCH v4] serial: core: reject baud_base values that overflow port->uartclk in uart_set_info()

From: Andy Shevchenko

Date: Thu Sep 24 2026 - 16:25:45 EST


On Thu, Sep 24, 2026 at 06:04:46AM +0000, Hui Peng wrote:
> In uart_set_info(), new_info->baud_base is multiplied by 16 and stored in
> uport->uartclk (an unsigned int):
>
> uport->uartclk = new_info->baud_base * 16;
>
> While uart_set_info() checks if (uartclk == 0) and
> if (new_info->baud_base < 9600), when new_info->baud_base exceeds
> UINT_MAX / 16 with low bits set (for example, 0x10000001), multiplying
> by 16 wraps around in 32-bit unsigned arithmetic to a small non-zero value
> (16), bypassing both uartclk == 0 and new_info->baud_base < 9600 and
> setting uport->uartclk = 16 (baud_base = 1, well below the required
> minimum of 9600 * 16).
>
> Reject new_info->baud_base > UINT_MAX / 16 before multiplying by 16 in
> uart_set_info().
>
> Tested in QEMU against Linux 7.3.0-rc3 by calling ioctl(fd, TIOCSSERIAL,
> &ss) with ss.baud_base = 0x10000001 on /dev/ttyS1: on the unfixed kernel
> TIOCSSERIAL succeeds (ret = 0) and wraps uport->uartclk to 16
> (TIOCGSERIAL reports baud_base = 1), whereas with the fix applied
> TIOCSSERIAL returns -EINVAL and preserves the existing uport->uartclk.

You should not do a reply into the same thread. Also I guess you missed my
review comments on one of the previous rounds. Taken all into account, please,
check that you addressed and/or commented on all remarks given by the reviewers
and prepare v5 accordingly.

--
With Best Regards,
Andy Shevchenko