Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a08c7c68 authored by Brian Rogers's avatar Brian Rogers Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB: ir-core: Fix null dereferences in the protocols sysfs interface



For some cards, ir_dev->props and ir_dev->raw are both NULL. These cards are
using built-in IR decoding instead of raw, and can't easily be made to switch
protocols.

So upon reading /sys/class/rc/rc?/protocols on such a card, return 'builtin' as
the supported and enabled protocol. Return -EINVAL on any attempts to change
the protocol. And most important of all, don't crash.

Signed-off-by: default avatarBrian Rogers <brian@xyzw.org>
Acked-by: default avatarJarod Wilson <jarod@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent ddc79e0f
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -67,13 +67,14 @@ static ssize_t show_protocols(struct device *d,
	char *tmp = buf;
	int i;

	if (ir_dev->props->driver_type == RC_DRIVER_SCANCODE) {
	if (ir_dev->props && ir_dev->props->driver_type == RC_DRIVER_SCANCODE) {
		enabled = ir_dev->rc_tab.ir_type;
		allowed = ir_dev->props->allowed_protos;
	} else {
	} else if (ir_dev->raw) {
		enabled = ir_dev->raw->enabled_protocols;
		allowed = ir_raw_get_allowed_protocols();
	}
	} else
		return sprintf(tmp, "[builtin]\n");

	IR_dprintk(1, "allowed - 0x%llx, enabled - 0x%llx\n",
		   (long long)allowed,
@@ -121,10 +122,14 @@ static ssize_t store_protocols(struct device *d,
	int rc, i, count = 0;
	unsigned long flags;

	if (ir_dev->props->driver_type == RC_DRIVER_SCANCODE)
	if (ir_dev->props && ir_dev->props->driver_type == RC_DRIVER_SCANCODE)
		type = ir_dev->rc_tab.ir_type;
	else
	else if (ir_dev->raw)
		type = ir_dev->raw->enabled_protocols;
	else {
		IR_dprintk(1, "Protocol switching not supported\n");
		return -EINVAL;
	}

	while ((tmp = strsep((char **) &data, " \n")) != NULL) {
		if (!*tmp)
@@ -185,7 +190,7 @@ static ssize_t store_protocols(struct device *d,
		}
	}

	if (ir_dev->props->driver_type == RC_DRIVER_SCANCODE) {
	if (ir_dev->props && ir_dev->props->driver_type == RC_DRIVER_SCANCODE) {
		spin_lock_irqsave(&ir_dev->rc_tab.lock, flags);
		ir_dev->rc_tab.ir_type = type;
		spin_unlock_irqrestore(&ir_dev->rc_tab.lock, flags);