lkml.org 
[lkml]   [2019]   [Mar]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.0 198/238] vt: perform safe console erase in the right order
    Date
    5.0-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Nicolas Pitre <nicolas.pitre@linaro.org>

    commit a6dbe442755999960ca54a9b8ecfd9606be0ea75 upstream.

    Commit 4b4ecd9cb853 ("vt: Perform safe console erase only once") removed
    what appeared to be an extra call to scr_memsetw(). This missed the fact
    that set_origin() must be called before clearing the screen otherwise
    old screen content gets restored on the screen when using vgacon. Let's
    fix that by moving all the scrollback handling to flush_scrollback()
    where it logically belongs, and invoking it before the actual screen
    clearing in csi_J(), making the code simpler in the end.

    Reported-by: Matthew Whitehead <tedheadster@gmail.com>
    Signed-off-by: Nicolas Pitre <nico@linaro.org>
    Tested-by: Matthew Whitehead <tedheadster@gmail.com>
    Fixes: 4b4ecd9cb853 ("vt: Perform safe console erase only once")
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/tty/vt/vt.c | 15 +++++++--------
    1 file changed, 7 insertions(+), 8 deletions(-)

    --- a/drivers/tty/vt/vt.c
    +++ b/drivers/tty/vt/vt.c
    @@ -935,8 +935,11 @@ static void flush_scrollback(struct vc_d
    {
    WARN_CONSOLE_UNLOCKED();

    + set_origin(vc);
    if (vc->vc_sw->con_flush_scrollback)
    vc->vc_sw->con_flush_scrollback(vc);
    + else
    + vc->vc_sw->con_switch(vc);
    }

    /*
    @@ -1503,8 +1506,10 @@ static void csi_J(struct vc_data *vc, in
    count = ((vc->vc_pos - vc->vc_origin) >> 1) + 1;
    start = (unsigned short *)vc->vc_origin;
    break;
    + case 3: /* include scrollback */
    + flush_scrollback(vc);
    + /* fallthrough */
    case 2: /* erase whole display */
    - case 3: /* (and scrollback buffer later) */
    vc_uniscr_clear_lines(vc, 0, vc->vc_rows);
    count = vc->vc_cols * vc->vc_rows;
    start = (unsigned short *)vc->vc_origin;
    @@ -1513,13 +1518,7 @@ static void csi_J(struct vc_data *vc, in
    return;
    }
    scr_memsetw(start, vc->vc_video_erase_char, 2 * count);
    - if (vpar == 3) {
    - set_origin(vc);
    - flush_scrollback(vc);
    - if (con_is_visible(vc))
    - update_screen(vc);
    - } else if (con_should_update(vc))
    - do_update_region(vc, (unsigned long) start, count);
    + update_region(vc, (unsigned long) start, count);
    vc->vc_need_wrap = 0;
    }


    \
     
     \ /
      Last update: 2019-03-22 13:25    [W:4.024 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site