mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] tty: fix data race in tty_buffer_flush
@ 2015-09-07 12:26 Dmitry Vyukov
  2015-09-08 12:48 ` Dmitry Vyukov
  0 siblings, 1 reply; 8+ messages in thread
From: Dmitry Vyukov @ 2015-09-07 12:26 UTC (permalink / raw)
  To: gregkh, peter, jslaby, linux-kernel
  Cc: jslaby, andreyknvl, kcc, glider, paulmck, hboehm, Dmitry Vyukov

tty_buffer_flush frees not acquired buffers.
As the result, for example, read of b->size in tty_buffer_free
can return garbage value which will lead to a huge buffer
hanging in the freelist. This is just the benignest
manifestation of freeing of a not acquired object.
If the object is passed to kfree, heap can be corrupted.

Acquire visibility over the buffer before freeing it.

The data race was found with KernelThreadSanitizer (KTSAN).

Signed-off-by: Dmitry Vyukov <dvyukov@google.com>
---
 drivers/tty/tty_buffer.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c
index 5a3fa89..7dab1b3 100644
--- a/drivers/tty/tty_buffer.c
+++ b/drivers/tty/tty_buffer.c
@@ -242,7 +242,7 @@ void tty_buffer_flush(struct tty_struct *tty, struct tty_ldisc *ld)
 	atomic_inc(&buf->priority);
 
 	mutex_lock(&buf->lock);
-	while ((next = buf->head->next) != NULL) {
+	while ((next = smp_load_acquire(&buf->head->next)) != NULL) {
 		tty_buffer_free(port, buf->head);
 		buf->head = next;
 	}
-- 
2.5.0.457.gab17608


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2015-09-17 12:51 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-09-07 12:26 [PATCH] tty: fix data race in tty_buffer_flush Dmitry Vyukov
2015-09-08 12:48 ` Dmitry Vyukov
2015-09-08 22:11   ` Greg KH
2015-09-16  1:38   ` Peter Hurley
2015-09-16 18:20     ` Dmitry Vyukov
2015-09-17 10:28       ` Dmitry Vyukov
2015-09-17 10:59         ` Dmitry Vyukov
2015-09-17 12:51         ` Greg Kroah-Hartman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome