lkml.org 
[lkml]   [2014]   [Jun]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.4 74/88] tty: Correct tty buffer flush.
    Date
    3.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Ilya Zykov <ilya@ilyx.ru>

    commit 64325a3be08d364a62ee8f84b2cf86934bc2544a 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: Ilya Zykov <ilya@ilyx.ru>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    Cc: Rui Xiang <rui.xiang@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/tty/tty_buffer.c | 11 +++++++----
    1 file changed, 7 insertions(+), 4 deletions(-)

    --- a/drivers/tty/tty_buffer.c
    +++ b/drivers/tty/tty_buffer.c
    @@ -114,11 +114,14 @@ static void __tty_buffer_flush(struct tt
    {
    struct tty_buffer *thead;

    - while ((thead = tty->buf.head) != NULL) {
    - tty->buf.head = thead->next;
    - tty_buffer_free(tty, thead);
    + if (tty->buf.head == NULL)
    + return;
    + 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;
    }

    /**



    \
     
     \ /
      Last update: 2014-06-10 06:41    [W:4.065 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site