mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
staging: media: tegra-video: fix of_node_put() on VIP parse errors
tegra_vip_channel_of_parse() initializes np from dev->of_node without
taking a reference, but its error paths drop one through the
err_node_put label. This underflows the refcount of the VIP device's
OF node when endpoint parsing fails on a malformed device tree.
The only reference the function takes on np is the success-path
of_node_get() stored in vip->chan.of_node, and that one is already
released by the tegra_vip_init() error path and by tegra_vip_exit().
Return errors directly instead of jumping to the bogus cleanup label.
Fixes: e740d199cf ("staging: media: tegra-video: add support for Tegra20 parallel input")
Cc: stable@vger.kernel.org
Assisted-by: Claude:claude-fable-5
Signed-off-by: Hao-Qun Huang <alvinhuang0603@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
This commit is contained in:
parent
1bd456afeb
commit
7393372f79
|
|
@ -126,7 +126,7 @@ static int tegra_vip_channel_of_parse(struct tegra_vip *vip)
|
|||
if (!ep) {
|
||||
err = -EINVAL;
|
||||
dev_err_probe(dev, err, "%pOF: error getting endpoint node\n", np);
|
||||
goto err_node_put;
|
||||
return err;
|
||||
}
|
||||
|
||||
fwh = of_fwnode_handle(ep);
|
||||
|
|
@ -134,14 +134,14 @@ static int tegra_vip_channel_of_parse(struct tegra_vip *vip)
|
|||
of_node_put(ep);
|
||||
if (err) {
|
||||
dev_err_probe(dev, err, "%pOF: failed to parse v4l2 endpoint\n", np);
|
||||
goto err_node_put;
|
||||
return err;
|
||||
}
|
||||
|
||||
num_pads = of_graph_get_endpoint_count(np);
|
||||
if (num_pads != TEGRA_VIP_PADS_NUM) {
|
||||
err = -EINVAL;
|
||||
dev_err_probe(dev, err, "%pOF: need 2 pads, got %d\n", np, num_pads);
|
||||
goto err_node_put;
|
||||
return err;
|
||||
}
|
||||
|
||||
vip->chan.of_node = of_node_get(np);
|
||||
|
|
@ -149,10 +149,6 @@ static int tegra_vip_channel_of_parse(struct tegra_vip *vip)
|
|||
vip->chan.pads[TEGRA_VIP_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE;
|
||||
|
||||
return 0;
|
||||
|
||||
err_node_put:
|
||||
of_node_put(np);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int tegra_vip_channel_init(struct tegra_vip *vip)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user