Re: the patch "vt: perform safe console erase" introduces a bug

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, 31 Mar 2019, Mikulas Patocka wrote:

> 
> 
> On Sat, 30 Mar 2019, Mikulas Patocka wrote:
> 
> > Hi
> > 
> > The patch a6dbe442755999960ca54a9b8ecfd9606be0ea75 ("vt: perform safe 
> > console erase in the right order") introduces a bug.
> > 
> > ---
> >  drivers/tty/vt/vt.c |    2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > Index: linux-5.0.5/drivers/tty/vt/vt.c
> > ===================================================================
> > --- linux-5.0.5.orig/drivers/tty/vt/vt.c	2019-03-30 19:29:26.000000000 +0100
> > +++ linux-5.0.5/drivers/tty/vt/vt.c	2019-03-30 19:30:50.000000000 +0100
> > @@ -1518,7 +1518,7 @@ static void csi_J(struct vc_data *vc, in
> >  			return;
> >  	}
> >  	scr_memsetw(start, vc->vc_video_erase_char, 2 * count);
> > -	update_region(vc, (unsigned long) start, count);
> > +	do_update_region(vc, (unsigned long) start, count);
> ^^^^ this is wrong too - it will clear the screen if \e[2J is printed on 
> inactive console. We need to use con_should_update(vc), just like it was 
> before:
> 
> 
> The patch a6dbe442755999960ca54a9b8ecfd9606be0ea75 ("vt: perform safe
> console erase in the right order") introduces a bug.
> 
> In order to reproduce the bug
> - use framebuffer console with the AMDGPU driver
> - type "links" to start the console www browser
> - press 'q' and space to exit links
> 
> --- now, the cursor line will be permanently visible in the center of the
> screen. It will stay there until something overwrites it.
> 
> Before the patch, there was a call to do_update_region, the patch changes
> it to update_region - and this seems to cause the bug with the cursor.
> 
> The bug goes away if we change update_region back to do_update_region.
> 
> Signed-off-by: Mikulas Patocka <mpatocka@xxxxxxxxxx>
> Cc: stable@xxxxxxxxxxxxxxx
> Fixes: a6dbe4427559 ("vt: perform safe console erase in the right order")

The code in update_region(() does call do_update_region() conditionally 
on con_should_update(vc).

But it does a set_cursor(vc) too which is the problem. So for the patch 
below:

Acked-by: Nicolas Pitre <nico@xxxxxxxxxxx>

However there is another unconditional call to do_update_region() in 
do_con_trol() (see case EShash) which might require a separate fix.

> ---
>  drivers/tty/vt/vt.c |    3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> Index: linux-5.0.5/drivers/tty/vt/vt.c
> ===================================================================
> --- linux-5.0.5.orig/drivers/tty/vt/vt.c	2019-03-30 19:29:26.000000000 +0100
> +++ linux-5.0.5/drivers/tty/vt/vt.c	2019-03-31 13:06:24.000000000 +0200
> @@ -1518,7 +1518,8 @@ static void csi_J(struct vc_data *vc, in
>  			return;
>  	}
>  	scr_memsetw(start, vc->vc_video_erase_char, 2 * count);
> -	update_region(vc, (unsigned long) start, count);
> +	if (con_should_update(vc))
> +		do_update_region(vc, (unsigned long) start, count);






>  	vc->vc_need_wrap = 0;
>  }
>  
> 



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux