2021-04-08 13:20:48

by Johan Hovold

[permalink] [raw]
Subject: [PATCH v2 0/3] TIOCSSERIAL fixes

This series fixes up a few issues with cdc-acm TIOCSSERIAL
implementation.

Johan

Changes in v2
- amend commit message to clarify that the 12 cs close_delay bug had
already been fixed by an earlier patch (1/3)

- amend commit message to clarify that the base clock rate isn't known
for CDC and that the current line speed can still be retrieved
through the standard termios interfaces (3/3)

Johan Hovold (3):
Revert "USB: cdc-acm: fix rounding error in TIOCSSERIAL"
USB: cdc-acm: fix unprivileged TIOCCSERIAL
USB: cdc-acm: fix TIOCGSERIAL implementation

drivers/usb/class/cdc-acm.c | 16 +++-------------
1 file changed, 3 insertions(+), 13 deletions(-)

--
2.26.3


2021-04-08 13:21:06

by Johan Hovold

[permalink] [raw]
Subject: [PATCH v2 1/3] Revert "USB: cdc-acm: fix rounding error in TIOCSSERIAL"

This reverts commit b401f8c4f492cbf74f3f59c9141e5be3071071bb.

The offending commit claimed that trying to set the values reported back
by TIOCGSERIAL as a regular user could result in an -EPERM error when HZ
is 250, but that was never the case.

With HZ=250, the default 0.5 second value of close_delay is converted to
125 jiffies when set and is converted back to 50 centiseconds by
TIOCGSERIAL as expected (not 12 cs as was claimed, even if that was the
case before an earlier fix).

Comparing the internal current and new jiffies values is just fine to
determine if the value is about to change so drop the bogus workaround
(which was also backported to stable).

For completeness: With different default values for these parameters or
with a HZ value not divisible by two, the lack of rounding when setting
the default values in tty_port_init() could result in an -EPERM being
returned, but this is hardly something we need to worry about.

Cc: Anthony Mallet <[email protected]>
Cc: [email protected]
Signed-off-by: Johan Hovold <[email protected]>
---
drivers/usb/class/cdc-acm.c | 11 ++---------
1 file changed, 2 insertions(+), 9 deletions(-)

diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 3fda1ec961d7..96e221803fa6 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -942,7 +942,6 @@ static int set_serial_info(struct tty_struct *tty, struct serial_struct *ss)
{
struct acm *acm = tty->driver_data;
unsigned int closing_wait, close_delay;
- unsigned int old_closing_wait, old_close_delay;
int retval = 0;

close_delay = msecs_to_jiffies(ss->close_delay * 10);
@@ -950,17 +949,11 @@ static int set_serial_info(struct tty_struct *tty, struct serial_struct *ss)
ASYNC_CLOSING_WAIT_NONE :
msecs_to_jiffies(ss->closing_wait * 10);

- /* we must redo the rounding here, so that the values match */
- old_close_delay = jiffies_to_msecs(acm->port.close_delay) / 10;
- old_closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
- ASYNC_CLOSING_WAIT_NONE :
- jiffies_to_msecs(acm->port.closing_wait) / 10;
-
mutex_lock(&acm->port.mutex);

if (!capable(CAP_SYS_ADMIN)) {
- if ((ss->close_delay != old_close_delay) ||
- (ss->closing_wait != old_closing_wait))
+ if ((close_delay != acm->port.close_delay) ||
+ (closing_wait != acm->port.closing_wait))
retval = -EPERM;
else
retval = -EOPNOTSUPP;
--
2.26.3

2021-04-08 13:34:04

by Oliver Neukum

[permalink] [raw]
Subject: Re: [PATCH v2 1/3] Revert "USB: cdc-acm: fix rounding error in TIOCSSERIAL"

Am Donnerstag, den 08.04.2021, 15:16 +0200 schrieb Johan Hovold:
> This reverts commit b401f8c4f492cbf74f3f59c9141e5be3071071bb.
>
> The offending commit claimed that trying to set the values reported back
> by TIOCGSERIAL as a regular user could result in an -EPERM error when HZ
> is 250, but that was never the case.
>
> With HZ=250, the default 0.5 second value of close_delay is converted to
> 125 jiffies when set and is converted back to 50 centiseconds by
> TIOCGSERIAL as expected (not 12 cs as was claimed, even if that was the
> case before an earlier fix).
>
> Comparing the internal current and new jiffies values is just fine to
> determine if the value is about to change so drop the bogus workaround
> (which was also backported to stable).
>
> For completeness: With different default values for these parameters or
> with a HZ value not divisible by two, the lack of rounding when setting
> the default values in tty_port_init() could result in an -EPERM being
> returned, but this is hardly something we need to worry about.
>
> Cc: Anthony Mallet <[email protected]>
> Cc: [email protected]
> Signed-off-by: Johan Hovold <[email protected]>
Acked-by: Oliver Neukum <[email protected]>