• Alan Cox's avatar
    fix serial buffer memory leak · 42fd552e
    Alan Cox authored
    Patch c5c34d48 (tty: flush flip buffer on
    ldisc input queue flush) introduces a race condition which can lead to memory
    leaks.
    
    The problem can be triggered when tcflush() is called when data are being
    pushed to the line discipline driver by flush_to_ldisc().
    
    flush_to_ldisc() releases tty->buf.lock when calling the line discipline
    receive_buf function. At that poing tty_buffer_flush() kicks in and sets both
    tty->buf.head and tty->buf.tail to NULL. When flush_to_ldisc() finishes, it
    restores tty->buf.head but doesn't touch tty->buf.tail. This corrups the
    buffer queue, and the next call to tty_buffer_request_room() will allocate a
    new buffer and overwrite tty->buf.head. The previous buffer is then lost
    forever without being released.
    
    (Thanks to Laurent for the above text, for finding, disgnosing and reporting
    the bug)
    
    - Use tty->flags bits for the flush status.
    
    - Wait for the flag to clear again before returning
    
    - Fix the doc error noted
    
    - Fix flush of empty queue leaving stale flushpending
    
    [akpm@linux-foundation.org: cleanup]
    Signed-off-by: default avatarAlan Cox <alan@redhat.com>
    Acked-by: default avatarPaul Fulghum <paulkf@microgate.com>
    Cc: Laurent Pinchart <laurentp@cse-semaphore.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    42fd552e
tty_io.c 103 KB