summaryrefslogtreecommitdiffstats
path: root/drivers/media/rc/rc-main.c
diff options
context:
space:
mode:
authorSean Young2017-09-23 23:44:03 +0200
committerMauro Carvalho Chehab2017-12-14 16:35:19 +0100
commitcb84343fced1febb5b21a9ef9082a07bfc3e7427 (patch)
tree769f5c01f820e7eac7ecde2c01ff954f0f78a9bc /drivers/media/rc/rc-main.c
parentmedia: lirc: move lirc_dev->attached to rc_dev->registered (diff)
downloadkernel-qcow2-linux-cb84343fced1febb5b21a9ef9082a07bfc3e7427.tar.gz
kernel-qcow2-linux-cb84343fced1febb5b21a9ef9082a07bfc3e7427.tar.xz
kernel-qcow2-linux-cb84343fced1febb5b21a9ef9082a07bfc3e7427.zip
media: lirc: do not call close() or open() on unregistered devices
If a lirc chardev is held open after a device is unplugged, rc_close() will be called after rc_unregister_device(). The driver is not expecting any calls at this point, and the iguanair driver causes an oops in this scenario. rc_open() can be called when the device is removed too, by calling open on the chardev whilst the device is being removed. Signed-off-by: Sean Young <sean@mess.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Diffstat (limited to 'drivers/media/rc/rc-main.c')
-rw-r--r--drivers/media/rc/rc-main.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c
index 8b1b20e7a3c3..ace00e77c96a 100644
--- a/drivers/media/rc/rc-main.c
+++ b/drivers/media/rc/rc-main.c
@@ -863,11 +863,15 @@ int rc_open(struct rc_dev *rdev)
mutex_lock(&rdev->lock);
- if (!rdev->users++ && rdev->open != NULL)
- rval = rdev->open(rdev);
+ if (!rdev->registered) {
+ rval = -ENODEV;
+ } else {
+ if (!rdev->users++ && rdev->open)
+ rval = rdev->open(rdev);
- if (rval)
- rdev->users--;
+ if (rval)
+ rdev->users--;
+ }
mutex_unlock(&rdev->lock);
@@ -886,7 +890,7 @@ void rc_close(struct rc_dev *rdev)
if (rdev) {
mutex_lock(&rdev->lock);
- if (!--rdev->users && rdev->close != NULL)
+ if (!--rdev->users && rdev->close && rdev->registered)
rdev->close(rdev);
mutex_unlock(&rdev->lock);