diff --git a/packages/linux/patches/raspberrypi/linux-905-backport-cdc-acm-fix.patch b/packages/linux/patches/raspberrypi/linux-905-backport-cdc-acm-fix.patch new file mode 100644 index 0000000000..645ea10c51 --- /dev/null +++ b/packages/linux/patches/raspberrypi/linux-905-backport-cdc-acm-fix.patch @@ -0,0 +1,59 @@ +From b8971d1e332bdf483479b426a442f98273bd0083 Mon Sep 17 00:00:00 2001 +From: Matthias Reichl +Date: Fri, 27 Mar 2020 15:29:57 +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 +Cc: stable +Cc: Oliver Neukum +Signed-off-by: Matthias Reichl +Link: https://lore.kernel.org/r/20200327150350.3657-1-hias@horus.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Matthias Reichl +--- + drivers/usb/class/cdc-acm.c | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c +index 8689bf7ba60ff..754f7e81e638a 100644 +--- a/drivers/usb/class/cdc-acm.c ++++ b/drivers/usb/class/cdc-acm.c +@@ -949,16 +949,16 @@ static int set_serial_info(struct acm *acm, + + mutex_lock(&acm->port.mutex); + +- if ((new_serial.close_delay != old_close_delay) || +- (new_serial.closing_wait != old_closing_wait)) { +- if (!capable(CAP_SYS_ADMIN)) ++ if (!capable(CAP_SYS_ADMIN)) { ++ if ((new_serial.close_delay != old_close_delay) || ++ (new_serial.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.20.1 +