Skip to content

Commit 5a7bd25

Browse files
grasseadrobertfoss
authored andcommitted
drm/bridge: lt8912b: fix incorrect handling of of_* return values
A static analysis shows several issues in the driver code at probing time. DT parsing errors were bad handled and could lead to bugs: - Bad error detection; - Bad release of resources Fixes: 30e2ae9 ("drm/bridge: Introduce LT8912B DSI to HDMI bridge") Reported-by: Dan Carpenter <[email protected]> Suggested-by: Dan Carpenter <[email protected]> Signed-off-by: Adrien Grassein <[email protected]> Reviewed-by: Andrzej Hajda <[email protected]> Reviewed-by: Dan Carpenter <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] Signed-off-by: Robert Foss <[email protected]>
1 parent ad085b3 commit 5a7bd25

File tree

1 file changed

+17
-15
lines changed

1 file changed

+17
-15
lines changed

drivers/gpu/drm/bridge/lontium-lt8912b.c

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,8 @@ static int lt8912_parse_dt(struct lt8912 *lt)
621621
{
622622
struct gpio_desc *gp_reset;
623623
struct device *dev = lt->dev;
624-
int ret = 0;
624+
int ret;
625+
int data_lanes;
625626
struct device_node *port_node;
626627
struct device_node *endpoint;
627628

@@ -635,19 +636,21 @@ static int lt8912_parse_dt(struct lt8912 *lt)
635636
lt->gp_reset = gp_reset;
636637

637638
endpoint = of_graph_get_endpoint_by_regs(dev->of_node, 0, -1);
638-
if (IS_ERR(endpoint)) {
639-
ret = PTR_ERR(endpoint);
640-
goto end;
641-
}
639+
if (!endpoint)
640+
return -ENODEV;
642641

643-
lt->data_lanes = of_property_count_u32_elems(endpoint, "data-lanes");
642+
data_lanes = of_property_count_u32_elems(endpoint, "data-lanes");
644643
of_node_put(endpoint);
644+
if (data_lanes < 0) {
645+
dev_err(lt->dev, "%s: Bad data-lanes property\n", __func__);
646+
return data_lanes;
647+
}
648+
lt->data_lanes = data_lanes;
645649

646650
lt->host_node = of_graph_get_remote_node(dev->of_node, 0, -1);
647651
if (!lt->host_node) {
648652
dev_err(lt->dev, "%s: Failed to get remote port\n", __func__);
649-
ret = -ENODEV;
650-
goto end;
653+
return -ENODEV;
651654
}
652655

653656
port_node = of_graph_get_remote_node(dev->of_node, 1, -1);
@@ -658,24 +661,23 @@ static int lt8912_parse_dt(struct lt8912 *lt)
658661
}
659662

660663
lt->hdmi_port = of_drm_find_bridge(port_node);
661-
if (IS_ERR(lt->hdmi_port)) {
664+
if (!lt->hdmi_port) {
662665
dev_err(lt->dev, "%s: Failed to get hdmi port\n", __func__);
663-
ret = PTR_ERR(lt->hdmi_port);
664-
of_node_put(lt->host_node);
665-
goto end;
666+
ret = -ENODEV;
667+
goto err_free_host_node;
666668
}
667669

668670
if (!of_device_is_compatible(port_node, "hdmi-connector")) {
669671
dev_err(lt->dev, "%s: Failed to get hdmi port\n", __func__);
670672
ret = -EINVAL;
673+
goto err_free_host_node;
671674
}
672675

673676
of_node_put(port_node);
674-
675-
end:
676-
return ret;
677+
return 0;
677678

678679
err_free_host_node:
680+
of_node_put(port_node);
679681
of_node_put(lt->host_node);
680682
return ret;
681683
}

0 commit comments

Comments
 (0)