Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

pty: don't limit the writes to 'pty_space()' inside 'pty_write()'

The whole write-room thing is something that is up to the _caller_ to
worry about, not the pty layer itself. The total buffer space will
still be limited by the buffering routines themselves, so there is no
advantage or need in having pty_write() artificially limit the size
somehow.

And what happened was that the caller (the n_tty line discipline, in
this case) may have verified that there is room for 2 bytes to be
written (for NL -> CRNL expansion), and it used to then do those writes
as two single-byte writes. And if the first byte written (CR) then
caused a new tty buffer to be allocated, pty_space() may have returned
zero when trying to write the second byte (LF), and then incorrectly
failed the write - leading to a lost newline character.

This should finally fix

http://bugzilla.kernel.org/show_bug.cgi?id=14015

Reported-by: Mikael Pettersson <mikpe@it.uu.se>
Acked-by: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

+1 -9
+1 -9
drivers/char/pty.c
··· 109 109 * the other side of the pty/tty pair. 110 110 */ 111 111 112 - static int pty_write(struct tty_struct *tty, const unsigned char *buf, 113 - int count) 112 + static int pty_write(struct tty_struct *tty, const unsigned char *buf, int c) 114 113 { 115 114 struct tty_struct *to = tty->link; 116 - int c; 117 115 118 116 if (tty->stopped) 119 117 return 0; 120 118 121 - /* This isn't locked but our 8K is quite sloppy so no 122 - big deal */ 123 - 124 - c = pty_space(to); 125 - if (c > count) 126 - c = count; 127 119 if (c > 0) { 128 120 /* Stuff the data into the input queue of the other end */ 129 121 c = tty_insert_flip_string(to, buf, c);