Skip to content

Commit

Permalink
tty: Always handle NULL flag ptr
Browse files Browse the repository at this point in the history
Most line disciplines already handle the undocumented NULL flag
ptr in their .receive_buf method; however, several don't.

Document the NULL flag ptr, and correct handling in the
N_MOUSE, N_GSM0710 and N_R394 line disciplines.

Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Peter Hurley authored and Greg Kroah-Hartman committed Dec 9, 2013
1 parent 6c67716 commit 82f91fe
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 18 deletions.
28 changes: 15 additions & 13 deletions drivers/input/serio/serport.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ static void serport_ldisc_receive(struct tty_struct *tty, const unsigned char *c
{
struct serport *serport = (struct serport*) tty->disc_data;
unsigned long flags;
unsigned int ch_flags;
unsigned int ch_flags = 0;
int i;

spin_lock_irqsave(&serport->lock, flags);
Expand All @@ -133,18 +133,20 @@ static void serport_ldisc_receive(struct tty_struct *tty, const unsigned char *c
goto out;

for (i = 0; i < count; i++) {
switch (fp[i]) {
case TTY_FRAME:
ch_flags = SERIO_FRAME;
break;

case TTY_PARITY:
ch_flags = SERIO_PARITY;
break;

default:
ch_flags = 0;
break;
if (fp) {
switch (fp[i]) {
case TTY_FRAME:
ch_flags = SERIO_FRAME;
break;

case TTY_PARITY:
ch_flags = SERIO_PARITY;
break;

default:
ch_flags = 0;
break;
}
}

serio_interrupt(serport->serio, cp[i], ch_flags);
Expand Down
5 changes: 3 additions & 2 deletions drivers/tty/n_gsm.c
Original file line number Diff line number Diff line change
Expand Up @@ -2269,14 +2269,15 @@ static void gsmld_receive_buf(struct tty_struct *tty, const unsigned char *cp,
char *f;
int i;
char buf[64];
char flags;
char flags = TTY_NORMAL;

if (debug & 4)
print_hex_dump_bytes("gsmld_receive: ", DUMP_PREFIX_OFFSET,
cp, count);

for (i = count, dp = cp, f = fp; i; i--, dp++) {
flags = *f++;
if (f)
flags = *f++;
switch (flags) {
case TTY_NORMAL:
gsm->receive(gsm, *dp);
Expand Down
2 changes: 1 addition & 1 deletion drivers/tty/n_r3964.c
Original file line number Diff line number Diff line change
Expand Up @@ -1244,7 +1244,7 @@ static void r3964_receive_buf(struct tty_struct *tty, const unsigned char *cp,
{
struct r3964_info *pInfo = tty->disc_data;
const unsigned char *p;
char *f, flags = 0;
char *f, flags = TTY_NORMAL;
int i;

for (i = count, p = cp, f = fp; i; i--, p++) {
Expand Down
6 changes: 4 additions & 2 deletions include/linux/tty_ldisc.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@
* processing. <cp> is a pointer to the buffer of input
* character received by the device. <fp> is a pointer to a
* pointer of flag bytes which indicate whether a character was
* received with a parity error, etc.
* received with a parity error, etc. <fp> may be NULL to indicate
* all data received is TTY_NORMAL.
*
* void (*write_wakeup)(struct tty_struct *);
*
Expand Down Expand Up @@ -118,7 +119,8 @@
* processing. <cp> is a pointer to the buffer of input
* character received by the device. <fp> is a pointer to a
* pointer of flag bytes which indicate whether a character was
* received with a parity error, etc.
* received with a parity error, etc. <fp> may be NULL to indicate
* all data received is TTY_NORMAL.
* If assigned, prefer this function for automatic flow control.
*/

Expand Down

0 comments on commit 82f91fe

Please sign in to comment.