• Peter Hurley's avatar
    serial: Fix divide-by-zero fault in uart_get_divisor() · 2f590344
    Peter Hurley authored
    commit 547039ec upstream.
    
    uart_get_baud_rate() will return baud == 0 if the max rate is set
    to the "magic" 38400 rate and the SPD_* flags are also specified.
    On the first iteration, if the current baud rate is higher than the
    max, the baud rate is clamped at the max (which in the degenerate
    case is 38400). On the second iteration, the now-"magic" 38400 baud
    rate selects the possibly higher alternate baud rate indicated by
    the SPD_* flag. Since only two loop iterations are performed, the
    loop is exited, a kernel WARNING is generated and a baud rate of
    0 is returned.
    
    Reproducible with:
     setserial /dev/ttyS0 spd_hi base_baud 38400
    
    Only perform the "magic" 38400 -> SPD_* baud transform on the first
    loop iteration, which prevents the degenerate case from recognizing
    the clamped baud rate as the "magic" 38400 value.
    Reported-by: default avatarRobert Święcki <robert@swiecki.net>
    Signed-off-by: default avatarPeter Hurley <peter@hurleysoftware.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
    2f590344
serial_core.c 71.2 KB