Skip to content
  • Gerd Hoffmann's avatar
    5b8541c6
    console: fix cell overflow · 5b8541c6
    Gerd Hoffmann authored
    
    
    Linux terminal behavior (coming from vt100 I think) is somewhat strange
    when it comes to line wraps:  When a character is printed to the last
    char cell of a line the cursor does NOT jump to the next line but stays
    where it is.  The line feed happens when the next character is printed.
    
    So the valid range for the cursor position is not 0 .. width-1 but
    0 .. width, where x == width represents the state where the line is
    full but the cursor didn't jump to the next line yet.
    
    The code for the 'clear from start of line' control sequence (ESC[1K)
    fails to handle this corner case correctly and may call
    console_clear_xy() with x == width.  That will incorrectly clear the
    first char cell of the next line, or in case the cursor happens to be on
    the last line overflow the cell buffer by one character (three bytes).
    
    Add a check to the loop to fix that.
    
    Didn't spot any other places with the same problem.  But it's easy to
    miss that corner case, so also allocate one extra cell as precaution, so
    in case we have simliar issues lurking elsewhere it at least wouldn't be
    a buffer overflow.
    
    v2: squashed in additional checks suggested by Christophe de Dinechin.
    
    Reported-by: default avatarAlexander Oleinik <alxndr@bu.edu>
    Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
    Reviewed-by: default avatarChristophe de Dinechin <dinechin@redhat.com>
    Message-id: 20190701075301.14165-1-kraxel@redhat.com
    5b8541c6
    console: fix cell overflow
    Gerd Hoffmann authored
    
    
    Linux terminal behavior (coming from vt100 I think) is somewhat strange
    when it comes to line wraps:  When a character is printed to the last
    char cell of a line the cursor does NOT jump to the next line but stays
    where it is.  The line feed happens when the next character is printed.
    
    So the valid range for the cursor position is not 0 .. width-1 but
    0 .. width, where x == width represents the state where the line is
    full but the cursor didn't jump to the next line yet.
    
    The code for the 'clear from start of line' control sequence (ESC[1K)
    fails to handle this corner case correctly and may call
    console_clear_xy() with x == width.  That will incorrectly clear the
    first char cell of the next line, or in case the cursor happens to be on
    the last line overflow the cell buffer by one character (three bytes).
    
    Add a check to the loop to fix that.
    
    Didn't spot any other places with the same problem.  But it's easy to
    miss that corner case, so also allocate one extra cell as precaution, so
    in case we have simliar issues lurking elsewhere it at least wouldn't be
    a buffer overflow.
    
    v2: squashed in additional checks suggested by Christophe de Dinechin.
    
    Reported-by: default avatarAlexander Oleinik <alxndr@bu.edu>
    Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
    Reviewed-by: default avatarChristophe de Dinechin <dinechin@redhat.com>
    Message-id: 20190701075301.14165-1-kraxel@redhat.com
Loading