On Fri, Aug 26, 2022 at 5:51 PM Ilpo Järvinen <ilpo.jarvinen@xxxxxxxxxxxxxxx> wrote: > > Due to the padding fields, the copying will need to a bit more than > usual. > > Move padding clearing into the helper that copies back to userspace. If you agree on the below and address as suggested, Reviewed-by: Andy Shevchenko <andy.shevchenko@xxxxxxxxx> > Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@xxxxxxxxxxxxxxx> > --- > drivers/tty/serial/serial_core.c | 41 +++++++++++++++++++++----------- > 1 file changed, 27 insertions(+), 14 deletions(-) > > diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c > index 9c1bf36b7a93..6d57cfdeda9d 100644 > --- a/drivers/tty/serial/serial_core.c > +++ b/drivers/tty/serial/serial_core.c > @@ -1375,10 +1375,6 @@ static void uart_sanitize_serial_rs485(struct uart_port *port, struct serial_rs4 > rs485->flags &= supported_flags; > > uart_sanitize_serial_rs485_delays(port, rs485); > - > - /* Return clean padding area to userspace */ > - memset(rs485->padding0, 0, sizeof(rs485->padding0)); > - memset(rs485->padding1, 0, sizeof(rs485->padding1)); > } > > static void uart_set_rs485_termination(struct uart_port *port, > @@ -1407,6 +1403,28 @@ int uart_rs485_config(struct uart_port *port) > } > EXPORT_SYMBOL_GPL(uart_rs485_config); > > +static int user_rs485_to_kernel_serial_rs485(struct serial_rs485 *rs485, > + const struct serial_rs485 __user *rs485_user) What about serial_rs485_from_user() > +{ > + if (copy_from_user(rs485, rs485_user, sizeof(*rs485))) > + return -EFAULT; > + > + return 0; > +} > + > +static int kernel_serial_rs485_to_user_rs485(struct serial_rs485 __user *rs485_user, > + struct serial_rs485 *rs485) serial_rs485_to_user() ? > +{ > + /* Return clean padding area to userspace */ > + memset(rs485->padding0, 0, sizeof(rs485->padding0)); > + memset(rs485->padding1, 0, sizeof(rs485->padding1)); > + > + if (copy_to_user(rs485_user, rs485, sizeof(*rs485))) > + return -EFAULT; > + > + return 0; > +} > + > static int uart_get_rs485_config(struct uart_port *port, > struct serial_rs485 __user *rs485_user) > { > @@ -1417,10 +1435,7 @@ static int uart_get_rs485_config(struct uart_port *port, > rs485 = port->rs485; > spin_unlock_irqrestore(&port->lock, flags); > > - if (copy_to_user(rs485_user, &rs485, sizeof(rs485))) > - return -EFAULT; > - > - return 0; > + return kernel_serial_rs485_to_user_rs485(rs485_user, &rs485); > } > > static int uart_set_rs485_config(struct tty_struct *tty, struct uart_port *port, > @@ -1433,8 +1448,9 @@ static int uart_set_rs485_config(struct tty_struct *tty, struct uart_port *port, > if (!port->rs485_config) > return -ENOTTY; > > - if (copy_from_user(&rs485, rs485_user, sizeof(*rs485_user))) > - return -EFAULT; > + ret = user_rs485_to_kernel_serial_rs485(&rs485, rs485_user); > + if (ret) > + return ret; > > ret = uart_check_rs485_flags(port, &rs485); > if (ret) > @@ -1450,10 +1466,7 @@ static int uart_set_rs485_config(struct tty_struct *tty, struct uart_port *port, > if (ret) > return ret; > > - if (copy_to_user(rs485_user, &port->rs485, sizeof(port->rs485))) > - return -EFAULT; > - > - return 0; > + return kernel_serial_rs485_to_user_rs485(rs485_user, &port->rs485); > } > > static int uart_get_iso7816_config(struct uart_port *port, > -- > 2.30.2 > -- With Best Regards, Andy Shevchenko