aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/evdev/cdev.c
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2018-11-04 15:49:06 +0000
committerDimitry Andric <dim@FreeBSD.org>2018-11-04 15:49:06 +0000
commit2a22df74e9fceaffd62ee437de08383d6cf8cfe0 (patch)
treed4887f0719a9a8b98c787012703fa65e21554dc8 /sys/dev/evdev/cdev.c
parent689486003b2d4637b61b61d5a30bf98fb11ddc16 (diff)
parent6d080f8660b370f83eb10a840b6d14b6dd84a1de (diff)
Notes
Diffstat (limited to 'sys/dev/evdev/cdev.c')
-rw-r--r--sys/dev/evdev/cdev.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/sys/dev/evdev/cdev.c b/sys/dev/evdev/cdev.c
index 433444973779..615a70bafc79 100644
--- a/sys/dev/evdev/cdev.c
+++ b/sys/dev/evdev/cdev.c
@@ -349,6 +349,19 @@ evdev_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag,
if (client->ec_revoked || evdev == NULL)
return (ENODEV);
+ /*
+ * Fix evdev state corrupted with discarding of kdb events.
+ * EVIOCGKEY and EVIOCGLED ioctls can suffer from this.
+ */
+ if (evdev->ev_kdb_active) {
+ EVDEV_LOCK(evdev);
+ if (evdev->ev_kdb_active) {
+ evdev->ev_kdb_active = false;
+ evdev_restore_after_kdb(evdev);
+ }
+ EVDEV_UNLOCK(evdev);
+ }
+
/* file I/O ioctl handling */
switch (cmd) {
case FIOSETOWN: