• Florian Achleitner's avatar
    sc16is7xx: Fix TX buffer overrun caused by wrong tx fifo level read-out · ed7a8504
    Florian Achleitner authored
    We found that our sc16is7xx on spi reported a TX fifo free space value
    (TXLVL_REG) of 255 ocassionally, which is obviously wrong, with a
    64 byte fifo and caused a buffer overrun and a kernel crash.
    
    To trigger this, a large write to the tty is sufficient. The fifo fills,
    TXLVL_REG reads zero, but the handle_tx function does a zero-data-length
    write to the TX fifo anyways through sc16is7xx_fifo_write. The next
    TXLVL_REG read then yields 255, for unknown reasons. A subsequent read
    is ok.
    
    Prevent zero-data-length writes if the TX fifo is full, because they are
    pointless, and because they trigger wrong TXLVL read-outs.
    
    Furthermore, prevent a TX buffer overrun if the peripheral reports values
    larger than the buffer size and thus, don't allow the peripheral to crash
    the kernel.
    Signed-off-by: default avatarFlorian Achleitner <achleitner.florian@fronius.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    ed7a8504
sc16is7xx.c 42.2 KB