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>
 
        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);
 
        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);