diff options
author | Johan Hovold <johan@kernel.org> | 2021-04-07 12:52:05 +0300 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2021-04-10 11:36:34 +0300 |
commit | 885c77d528e14df86c1e146541c57f1c0ce0708e (patch) | |
tree | 19cdc5f281efc1db323e8c31899dfaa5d354e866 /drivers/tty/tty_io.c | |
parent | 1b7bc6b10a7eab0f5f9d7d8ee5a4b230a9dcb487 (diff) | |
download | linux-885c77d528e14df86c1e146541c57f1c0ce0708e.tar.xz |
tty: refactor TIOCSSERIAL handling
Factor out the deprecated serial flags handling and tty-operation check
shared with the compat TIOCSSERIAL handler.
Signed-off-by: Johan Hovold <johan@kernel.org>
Link: https://lore.kernel.org/r/20210407095208.31838-6-johan@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/tty_io.c')
-rw-r--r-- | drivers/tty/tty_io.c | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c index e00efd299abd..36e6b28fb80d 100644 --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c @@ -2624,23 +2624,31 @@ static int tty_tiocgicount(struct tty_struct *tty, void __user *arg) return 0; } -static int tty_tiocsserial(struct tty_struct *tty, struct serial_struct __user *ss) +static int tty_set_serial(struct tty_struct *tty, struct serial_struct *ss) { char comm[TASK_COMM_LEN]; - struct serial_struct v; int flags; - if (copy_from_user(&v, ss, sizeof(*ss))) - return -EFAULT; - - flags = v.flags & ASYNC_DEPRECATED; + flags = ss->flags & ASYNC_DEPRECATED; if (flags) pr_warn_ratelimited("%s: '%s' is using deprecated serial flags (with no effect): %.8x\n", __func__, get_task_comm(comm, current), flags); + if (!tty->ops->set_serial) return -ENOTTY; - return tty->ops->set_serial(tty, &v); + + return tty->ops->set_serial(tty, ss); +} + +static int tty_tiocsserial(struct tty_struct *tty, struct serial_struct __user *ss) +{ + struct serial_struct v; + + if (copy_from_user(&v, ss, sizeof(*ss))) + return -EFAULT; + + return tty_set_serial(tty, &v); } static int tty_tiocgserial(struct tty_struct *tty, struct serial_struct __user *ss) @@ -2838,10 +2846,8 @@ struct serial_struct32 { static int compat_tty_tiocsserial(struct tty_struct *tty, struct serial_struct32 __user *ss) { - char comm[TASK_COMM_LEN]; struct serial_struct32 v32; struct serial_struct v; - int flags; if (copy_from_user(&v32, ss, sizeof(*ss))) return -EFAULT; @@ -2852,14 +2858,7 @@ static int compat_tty_tiocsserial(struct tty_struct *tty, v.port_high = v32.port_high; v.iomap_base = 0; - flags = v.flags & ASYNC_DEPRECATED; - - if (flags) - pr_warn_ratelimited("%s: '%s' is using deprecated serial flags (with no effect): %.8x\n", - __func__, get_task_comm(comm, current), flags); - if (!tty->ops->set_serial) - return -ENOTTY; - return tty->ops->set_serial(tty, &v); + return tty_set_serial(tty, &v); } static int compat_tty_tiocgserial(struct tty_struct *tty, |