Date: Fri, 08 May 2015 06:34:19 +0200 From: Hans Petter Selasky <hps@selasky.org> To: Garrett Cooper <yaneurabeya@gmail.com>, Kevin Oberman <rkoberman@gmail.com> Cc: FreeBSD Current <freebsd-current@freebsd.org>, Ed Maste <emaste@freebsd.org>, Aleksandr Rybalko <ray@FreeBSD.org> Subject: Re: Race VT+X11 on -current Message-ID: <554C3CCB.3030809@selasky.org> In-Reply-To: <554BD2A8.70702@selasky.org> References: <554B5D11.3080709@selasky.org> <CAN6yY1vno%2B-nV9zBYp11A=F-vAURbhraEFyQR_ue4W7h8pQUMw@mail.gmail.com> <AA8B24D1-DF5A-42CD-8755-15EF3C46E760@gmail.com> <554BC475.50203@selasky.org> <554BD2A8.70702@selasky.org>
next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format. --------------080204030301050704060908 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Hi, I have a fix, attached. I'll just throw this in if nobody objects. Seems like a trivial issue: Prevent switching to NULL or own window in the "vt_proc_window_switch" function. This fixes an issue where X11 keyboard input can appear stuck. The cause of the problem is a duplicate TTY device window switch IOCTL during boot, which leaves the "vt_switch_timer" running, because the current window is already selected. While at it factor out some NULL checks. PR: 200032 Reported by: multiple people MFC after: 1 week --HPS --------------080204030301050704060908 Content-Type: text/x-diff; name="vt.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="vt.diff" Index: vt_core.c =================================================================== --- vt_core.c (revision 282504) +++ vt_core.c (working copy) @@ -451,9 +451,22 @@ struct vt_device *vd; int ret; + /* Prevent switching to NULL */ + if (vw == NULL) { + DPRINTF(30, "%s: Cannot switch to NULL.", __func__); + return (EINVAL); + } vd = vw->vw_device; curvw = vd->vd_curwindow; + /* + * Prevent switching to self to avoid starting the + * "vt_switch_timer()" again: + */ + if (vw == curvw) { + DPRINTF(30, "%s: Cannot switch to self.", __func__); + return (0); + } if (curvw->vw_flags & VWF_VTYLOCK) return (EBUSY); @@ -664,8 +677,7 @@ if (console == 0) { if (c >= F_SCR && c <= MIN(L_SCR, F_SCR + VT_MAXWINDOWS - 1)) { vw = vd->vd_windows[c - F_SCR]; - if (vw != NULL) - vt_proc_window_switch(vw); + vt_proc_window_switch(vw); return; } VT_LOCK(vd); @@ -750,8 +762,7 @@ if (c >= F_SCR && c <= MIN(L_SCR, F_SCR + VT_MAXWINDOWS - 1)) { vw = vd->vd_windows[c - F_SCR]; - if (vw != NULL) - vt_proc_window_switch(vw); + vt_proc_window_switch(vw); return (0); } @@ -760,15 +771,13 @@ /* Switch to next VT. */ c = (vw->vw_number + 1) % VT_MAXWINDOWS; vw = vd->vd_windows[c]; - if (vw != NULL) - vt_proc_window_switch(vw); + vt_proc_window_switch(vw); return (0); case PREV: /* Switch to previous VT. */ c = (vw->vw_number - 1) % VT_MAXWINDOWS; vw = vd->vd_windows[c]; - if (vw != NULL) - vt_proc_window_switch(vw); + vt_proc_window_switch(vw); return (0); case SLK: { vt_save_kbd_state(vw, kbd); --------------080204030301050704060908--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?554C3CCB.3030809>