| From: Douglas Bagnall <douglas@paradise.net.nz> |
| Date: Fri, 6 Jul 2012 23:27:57 -0300 |
| Subject: [media] Avoid sysfs oops when an rc_dev's raw device is absent |
| |
| commit 720bb6436ff30fccad05cf5bdf961ea5b1f5686d upstream. |
| |
| For some reason, when the lirc daemon learns that a usb remote control |
| has been unplugged, it wants to read the sysfs attributes of the |
| disappearing device. This is useful for uncovering transient |
| inconsistencies, but less so for keeping the system running when such |
| inconsistencies exist. |
| |
| Under some circumstances (like every time I unplug my dvb stick from |
| my laptop), lirc catches an rc_dev whose raw event handler has been |
| removed (presumably by ir_raw_event_unregister), and proceeds to |
| interrogate the raw protocols supported by the NULL pointer. |
| |
| This patch avoids the NULL dereference, and ignores the issue of how |
| this state of affairs came about in the first place. |
| |
| Version 2 incorporates changes recommended by Mauro Carvalho Chehab |
| (-ENODEV instead of -EINVAL, and a signed-off-by). |
| |
| Signed-off-by: Douglas Bagnall <douglas@paradise.net.nz> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/media/rc/rc-main.c | 5 +++-- |
| 1 file changed, 3 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/media/rc/rc-main.c |
| +++ b/drivers/media/rc/rc-main.c |
| @@ -774,10 +774,11 @@ static ssize_t show_protocols(struct dev |
| if (dev->driver_type == RC_DRIVER_SCANCODE) { |
| enabled = dev->rc_map.rc_type; |
| allowed = dev->allowed_protos; |
| - } else { |
| + } else if (dev->raw) { |
| enabled = dev->raw->enabled_protocols; |
| allowed = ir_raw_get_allowed_protocols(); |
| - } |
| + } else |
| + return -ENODEV; |
| |
| IR_dprintk(1, "allowed - 0x%llx, enabled - 0x%llx\n", |
| (long long)allowed, |