| From 189dcc62b89c80bb330d3bef6d20e9b44980135e Mon Sep 17 00:00:00 2001 |
| From: Matthias Reichl <hias@horus.com> |
| Date: Fri, 27 Mar 2020 16:03:50 +0100 |
| Subject: [PATCH] USB: cdc-acm: restore capability check order |
| |
| commit 62d65bdd9d05158aa2547f8ef72375535f3bc6e3 upstream. |
| |
| commit b401f8c4f492c ("USB: cdc-acm: fix rounding error in TIOCSSERIAL") |
| introduced a regression by changing the order of capability and close |
| settings change checks. When running with CAP_SYS_ADMIN setting the |
| close settings to the values already set resulted in -EOPNOTSUPP. |
| |
| Fix this by changing the check order back to how it was before. |
| |
| Fixes: b401f8c4f492c ("USB: cdc-acm: fix rounding error in TIOCSSERIAL") |
| Cc: Anthony Mallet <anthony.mallet@laas.fr> |
| Cc: stable <stable@vger.kernel.org> |
| Cc: Oliver Neukum <oneukum@suse.com> |
| Signed-off-by: Matthias Reichl <hias@horus.com> |
| Link: https://lore.kernel.org/r/20200327150350.3657-1-hias@horus.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c |
| index 47f09a6ce7bd..84d6f7df09a4 100644 |
| --- a/drivers/usb/class/cdc-acm.c |
| +++ b/drivers/usb/class/cdc-acm.c |
| @@ -923,16 +923,16 @@ static int set_serial_info(struct tty_struct *tty, struct serial_struct *ss) |
| |
| mutex_lock(&acm->port.mutex); |
| |
| - if ((ss->close_delay != old_close_delay) || |
| - (ss->closing_wait != old_closing_wait)) { |
| - if (!capable(CAP_SYS_ADMIN)) |
| + if (!capable(CAP_SYS_ADMIN)) { |
| + if ((ss->close_delay != old_close_delay) || |
| + (ss->closing_wait != old_closing_wait)) |
| retval = -EPERM; |
| - else { |
| - acm->port.close_delay = close_delay; |
| - acm->port.closing_wait = closing_wait; |
| - } |
| - } else |
| - retval = -EOPNOTSUPP; |
| + else |
| + retval = -EOPNOTSUPP; |
| + } else { |
| + acm->port.close_delay = close_delay; |
| + acm->port.closing_wait = closing_wait; |
| + } |
| |
| mutex_unlock(&acm->port.mutex); |
| return retval; |
| -- |
| 2.7.4 |
| |