Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b05581b8 authored by Nicolas Pitre's avatar Nicolas Pitre Committed by Greg Kroah-Hartman
Browse files

vt: perform safe console erase in the right order



commit a6dbe442755999960ca54a9b8ecfd9606be0ea75 upstream.

Commit 4b4ecd9c ("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: default avatarMatthew Whitehead <tedheadster@gmail.com>
Signed-off-by: default avatarNicolas Pitre <nico@linaro.org>
Tested-by: default avatarMatthew Whitehead <tedheadster@gmail.com>
Fixes: 4b4ecd9c ("vt: Perform safe console erase only once")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2ca85aac
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -935,8 +935,11 @@ static void flush_scrollback(struct vc_data *vc)
{
	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);
}

/*
@@ -1506,8 +1509,10 @@ static void csi_J(struct vc_data *vc, int vpar)
			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;
@@ -1516,13 +1521,7 @@ static void csi_J(struct vc_data *vc, int vpar)
			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;
}