Commit a1843e95 authored by Ilya Zykov's avatar Ilya Zykov Committed by Greg Kroah-Hartman

tty: Correct tty buffer flush.

commit 64325a3b upstream.

  The root of problem is carelessly zeroing pointer(in function __tty_buffer_flush()),
when another thread can use it. It can be cause of "NULL pointer dereference".
  Main idea of the patch, this is never free last (struct tty_buffer) in the active buffer.
Only flush the data for ldisc(buf->head->read = buf->head->commit).
At that moment driver can collect(write) data in buffer without conflict.
It is repeat behavior of flush_to_ldisc(), only without feeding data to ldisc.
Signed-off-by: default avatarIlya Zykov <ilya@ilyx.ru>
Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
Cc: Rui Xiang <rui.xiang@huawei.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent f84f26e7
...@@ -114,11 +114,14 @@ static void __tty_buffer_flush(struct tty_struct *tty) ...@@ -114,11 +114,14 @@ static void __tty_buffer_flush(struct tty_struct *tty)
{ {
struct tty_buffer *thead; struct tty_buffer *thead;
while ((thead = tty->buf.head) != NULL) { if (tty->buf.head == NULL)
tty->buf.head = thead->next; return;
tty_buffer_free(tty, thead); while ((thead = tty->buf.head->next) != NULL) {
tty_buffer_free(tty, tty->buf.head);
tty->buf.head = thead;
} }
tty->buf.tail = NULL; WARN_ON(tty->buf.head != tty->buf.tail);
tty->buf.head->read = tty->buf.head->commit;
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment