mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 18:09:56 +00:00
tty: fix termios input-speed encoding when using BOTHER
[ Upstream commit1cee38f036] When the termios CIBAUD bits are left unset (i.e. B0), we use the same output and input speed and should leave CIBAUD unchanged. When the user requests a rate using BOTHER and c_ospeed which the driver cannot set exactly, the driver can report back the actual baud rate using tty_termios_encode_baud_rate(). If this rate is close enough to a standard rate however, we could end up setting CIBAUD to a Bfoo value despite the user having left it unset. This in turn could lead to an unexpected input rate being set on subsequent termios updates. Fix this by using a zero tolerance value also for the input rate when CIBAUD is clear so that the matching logic works as expected. Fixes:78137e3b34("[PATCH] tty: improve encode_baud_rate logic") Signed-off-by: Johan Hovold <johan@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
24d7347116
commit
859a99742a
@@ -157,16 +157,20 @@ void tty_termios_encode_baud_rate(struct ktermios *termios,
|
|||||||
termios->c_ospeed = obaud;
|
termios->c_ospeed = obaud;
|
||||||
|
|
||||||
#ifdef BOTHER
|
#ifdef BOTHER
|
||||||
|
if ((termios->c_cflag >> IBSHIFT) & CBAUD)
|
||||||
|
ibinput = 1; /* An input speed was specified */
|
||||||
|
|
||||||
/* If the user asked for a precise weird speed give a precise weird
|
/* If the user asked for a precise weird speed give a precise weird
|
||||||
answer. If they asked for a Bfoo speed they may have problems
|
answer. If they asked for a Bfoo speed they may have problems
|
||||||
digesting non-exact replies so fuzz a bit */
|
digesting non-exact replies so fuzz a bit */
|
||||||
|
|
||||||
if ((termios->c_cflag & CBAUD) == BOTHER)
|
if ((termios->c_cflag & CBAUD) == BOTHER) {
|
||||||
oclose = 0;
|
oclose = 0;
|
||||||
|
if (!ibinput)
|
||||||
|
iclose = 0;
|
||||||
|
}
|
||||||
if (((termios->c_cflag >> IBSHIFT) & CBAUD) == BOTHER)
|
if (((termios->c_cflag >> IBSHIFT) & CBAUD) == BOTHER)
|
||||||
iclose = 0;
|
iclose = 0;
|
||||||
if ((termios->c_cflag >> IBSHIFT) & CBAUD)
|
|
||||||
ibinput = 1; /* An input speed was specified */
|
|
||||||
#endif
|
#endif
|
||||||
termios->c_cflag &= ~CBAUD;
|
termios->c_cflag &= ~CBAUD;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user