]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.19.31/vt-perform-safe-console-erase-in-the-right-order.patch
Linux 4.19.31
[thirdparty/kernel/stable-queue.git] / releases / 4.19.31 / vt-perform-safe-console-erase-in-the-right-order.patch
CommitLineData
77e25528
GKH
1From a6dbe442755999960ca54a9b8ecfd9606be0ea75 Mon Sep 17 00:00:00 2001
2From: Nicolas Pitre <nicolas.pitre@linaro.org>
3Date: Mon, 11 Feb 2019 19:36:41 -0500
4Subject: vt: perform safe console erase in the right order
5
6From: Nicolas Pitre <nicolas.pitre@linaro.org>
7
8commit a6dbe442755999960ca54a9b8ecfd9606be0ea75 upstream.
9
10Commit 4b4ecd9cb853 ("vt: Perform safe console erase only once") removed
11what appeared to be an extra call to scr_memsetw(). This missed the fact
12that set_origin() must be called before clearing the screen otherwise
13old screen content gets restored on the screen when using vgacon. Let's
14fix that by moving all the scrollback handling to flush_scrollback()
15where it logically belongs, and invoking it before the actual screen
16clearing in csi_J(), making the code simpler in the end.
17
18Reported-by: Matthew Whitehead <tedheadster@gmail.com>
19Signed-off-by: Nicolas Pitre <nico@linaro.org>
20Tested-by: Matthew Whitehead <tedheadster@gmail.com>
21Fixes: 4b4ecd9cb853 ("vt: Perform safe console erase only once")
22Cc: stable@vger.kernel.org
23Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
24
25---
26 drivers/tty/vt/vt.c | 15 +++++++--------
27 1 file changed, 7 insertions(+), 8 deletions(-)
28
29--- a/drivers/tty/vt/vt.c
30+++ b/drivers/tty/vt/vt.c
31@@ -935,8 +935,11 @@ static void flush_scrollback(struct vc_d
32 {
33 WARN_CONSOLE_UNLOCKED();
34
35+ set_origin(vc);
36 if (vc->vc_sw->con_flush_scrollback)
37 vc->vc_sw->con_flush_scrollback(vc);
38+ else
39+ vc->vc_sw->con_switch(vc);
40 }
41
42 /*
43@@ -1506,8 +1509,10 @@ static void csi_J(struct vc_data *vc, in
44 count = ((vc->vc_pos - vc->vc_origin) >> 1) + 1;
45 start = (unsigned short *)vc->vc_origin;
46 break;
47+ case 3: /* include scrollback */
48+ flush_scrollback(vc);
49+ /* fallthrough */
50 case 2: /* erase whole display */
51- case 3: /* (and scrollback buffer later) */
52 vc_uniscr_clear_lines(vc, 0, vc->vc_rows);
53 count = vc->vc_cols * vc->vc_rows;
54 start = (unsigned short *)vc->vc_origin;
55@@ -1516,13 +1521,7 @@ static void csi_J(struct vc_data *vc, in
56 return;
57 }
58 scr_memsetw(start, vc->vc_video_erase_char, 2 * count);
59- if (vpar == 3) {
60- set_origin(vc);
61- flush_scrollback(vc);
62- if (con_is_visible(vc))
63- update_screen(vc);
64- } else if (con_should_update(vc))
65- do_update_region(vc, (unsigned long) start, count);
66+ update_region(vc, (unsigned long) start, count);
67 vc->vc_need_wrap = 0;
68 }
69