svn commit: r352897 - stable/11/sys/dev/vt
Andriy Gapon
avg at FreeBSD.org
Mon Sep 30 13:34:31 UTC 2019
Author: avg
Date: Mon Sep 30 13:34:30 2019
New Revision: 352897
URL: https://svnweb.freebsd.org/changeset/base/352897
Log:
MFC r352505: vt: fix problems with trying to switch to a closed VT
Modified:
stable/11/sys/dev/vt/vt_core.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/dev/vt/vt_core.c
==============================================================================
--- stable/11/sys/dev/vt/vt_core.c Mon Sep 30 13:33:37 2019 (r352896)
+++ stable/11/sys/dev/vt/vt_core.c Mon Sep 30 13:34:30 2019 (r352897)
@@ -316,7 +316,7 @@ static void
vt_switch_timer(void *arg)
{
- vt_late_window_switch((struct vt_window *)arg);
+ (void)vt_late_window_switch((struct vt_window *)arg);
}
static int
@@ -438,13 +438,22 @@ vt_window_postswitch(struct vt_window *vw)
static int
vt_late_window_switch(struct vt_window *vw)
{
+ struct vt_window *curvw;
int ret;
callout_stop(&vw->vw_proc_dead_timer);
ret = vt_window_switch(vw);
- if (ret)
+ if (ret != 0) {
+ /*
+ * If the switch hasn't happened, then return the VT
+ * to the current owner, if any.
+ */
+ curvw = vw->vw_device->vd_curwindow;
+ if (curvw->vw_smode.mode == VT_PROCESS)
+ (void)vt_window_postswitch(curvw);
return (ret);
+ }
/* Notify owner process about terminal availability. */
if (vw->vw_smode.mode == VT_PROCESS) {
@@ -490,6 +499,19 @@ vt_proc_window_switch(struct vt_window *vw)
return (0); /* success */
}
+ /*
+ * Early check for an attempt to switch to a non-functional VT.
+ * The same check is done in vt_window_switch(), but it's better
+ * to fail as early as possible to avoid needless pre-switch
+ * actions.
+ */
+ VT_LOCK(vd);
+ if ((vw->vw_flags & (VWF_OPENED|VWF_CONSOLE)) == 0) {
+ VT_UNLOCK(vd);
+ return (EINVAL);
+ }
+ VT_UNLOCK(vd);
+
/* Ask current process permission to switch away. */
if (curvw->vw_smode.mode == VT_PROCESS) {
DPRINTF(30, "%s: VT_PROCESS ", __func__);
@@ -1718,7 +1740,7 @@ finish_vt_rel(struct vt_window *vw, int release, int *
vw->vw_flags &= ~VWF_SWWAIT_REL;
if (release) {
callout_drain(&vw->vw_proc_dead_timer);
- vt_late_window_switch(vw->vw_switch_to);
+ (void)vt_late_window_switch(vw->vw_switch_to);
}
return (0);
}
More information about the svn-src-stable-11
mailing list