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

Commit 04b96d1a authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab
Browse files

[media] v4l: omap3isp: Fix OF node double put when parsing OF graph



When parsing the graph the driver loops over all endpoints using
of_graph_get_next_endpoint(). The function handles reference counting of
the passed and returned nodes, so the returned node's reference count
must not be decreased manually in the normal path.

Move the offending of_node_put() call to the error path that requires
manual reference count handling.

Reported-by: default avatarH. Nikolaus Schaller <hns@goldelico.com>
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 03c47aae
Loading
Loading
Loading
Loading
+9 −10
Original line number Diff line number Diff line
@@ -2117,23 +2117,18 @@ static int isp_of_parse_nodes(struct device *dev,
		struct isp_async_subdev *isd;

		isd = devm_kzalloc(dev, sizeof(*isd), GFP_KERNEL);
		if (!isd) {
			of_node_put(node);
			return -ENOMEM;
		}
		if (!isd)
			goto error;

		notifier->subdevs[notifier->num_subdevs] = &isd->asd;

		if (isp_of_parse_node(dev, node, isd)) {
			of_node_put(node);
			return -EINVAL;
		}
		if (isp_of_parse_node(dev, node, isd))
			goto error;

		isd->asd.match.of.node = of_graph_get_remote_port_parent(node);
		of_node_put(node);
		if (!isd->asd.match.of.node) {
			dev_warn(dev, "bad remote port parent\n");
			return -EINVAL;
			goto error;
		}

		isd->asd.match_type = V4L2_ASYNC_MATCH_OF;
@@ -2141,6 +2136,10 @@ static int isp_of_parse_nodes(struct device *dev,
	}

	return notifier->num_subdevs;

error:
	of_node_put(node);
	return -EINVAL;
}

static int isp_subdev_notifier_bound(struct v4l2_async_notifier *async,