staging: greybus: uart: Fix atomicity violation in get_serial_info()
authorQiu-ji Chen <chenqiuji666@gmail.com>
Thu, 7 Nov 2024 11:33:37 +0000 (19:33 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 10 Nov 2024 07:02:37 +0000 (08:02 +0100)
Our static checker found a bug where set_serial_info() uses a mutex, but
get_serial_info() does not. Fortunately, the impact of this is relatively
minor. It doesn't cause a crash or any other serious issues. However, if a
race condition occurs between set_serial_info() and get_serial_info(),
there is a chance that the data returned by get_serial_info() will be
meaningless.

Signed-off-by: Qiu-ji Chen <chenqiuji666@gmail.com>
Fixes: 0aad5ad563c8 ("greybus/uart: switch to ->[sg]et_serial()")
Reviewed-by: Johan Hovold <johan+linaro@kernel.org>
Reviewed-by: Dan Carpenter <dan.carpenter@linaro.org>
Reviewed-by: Alex Elder <elder@riscstar.com>
Link: https://lore.kernel.org/r/20241107113337.402042-1-chenqiuji666@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/greybus/uart.c

index cdf4ebb93b104e85296fa770a2d9692114b3d022..8eab94cb06faf64dbf171edb7c924cbc00fb3c02 100644 (file)
@@ -596,11 +596,13 @@ static int get_serial_info(struct tty_struct *tty,
        struct gb_tty *gb_tty = tty->driver_data;
 
        ss->line = gb_tty->minor;
+       mutex_lock(&gb_tty->port.mutex);
        ss->close_delay = jiffies_to_msecs(gb_tty->port.close_delay) / 10;
        ss->closing_wait =
                gb_tty->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
                ASYNC_CLOSING_WAIT_NONE :
                jiffies_to_msecs(gb_tty->port.closing_wait) / 10;
+       mutex_unlock(&gb_tty->port.mutex);
 
        return 0;
 }