• A
    fix serial buffer memory leak · 42fd552e
    Alan Cox 提交于
    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: NAlan Cox <alan@redhat.com>
    Acked-by: NPaul Fulghum <paulkf@microgate.com>
    Cc: Laurent Pinchart <laurentp@cse-semaphore.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    42fd552e
tty.h 13.5 KB