|
Thomas Zimmermann |
f023a6 |
From 26c2b7d9fac42eb8317f3ceefa4c1a9a9170ca69 Mon Sep 17 00:00:00 2001
|
|
Thomas Zimmermann |
f023a6 |
From: Liang He <windhl@126.com>
|
|
Thomas Zimmermann |
f023a6 |
Date: Tue, 19 Jul 2022 16:25:46 +0800
|
|
Thomas Zimmermann |
f023a6 |
Subject: video: fbdev: amba-clcd: Fix refcount leak bugs
|
|
Thomas Zimmermann |
f023a6 |
Git-commit: 26c2b7d9fac42eb8317f3ceefa4c1a9a9170ca69
|
|
Thomas Zimmermann |
f023a6 |
Patch-mainline: v6.0-rc1
|
|
Thomas Zimmermann |
f023a6 |
References: bsc#1154048
|
|
Thomas Zimmermann |
f023a6 |
|
|
Thomas Zimmermann |
f023a6 |
In clcdfb_of_init_display(), we should call of_node_put() for the
|
|
Thomas Zimmermann |
f023a6 |
references returned by of_graph_get_next_endpoint() and
|
|
Thomas Zimmermann |
f023a6 |
of_graph_get_remote_port_parent() which have increased the refcount.
|
|
Thomas Zimmermann |
f023a6 |
|
|
Thomas Zimmermann |
f023a6 |
Besides, we should call of_node_put() both in fail path or when
|
|
Thomas Zimmermann |
f023a6 |
the references are not used anymore.
|
|
Thomas Zimmermann |
f023a6 |
|
|
Thomas Zimmermann |
f023a6 |
Fixes: d10715be03bd ("video: ARM CLCD: Add DT support")
|
|
Thomas Zimmermann |
f023a6 |
Signed-off-by: Liang He <windhl@126.com>
|
|
Thomas Zimmermann |
f023a6 |
Signed-off-by: Helge Deller <deller@gmx.de>
|
|
Thomas Zimmermann |
f023a6 |
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
|
|
Thomas Zimmermann |
f023a6 |
---
|
|
Thomas Zimmermann |
f023a6 |
drivers/video/fbdev/amba-clcd.c | 24 ++++++++++++++++++------
|
|
Thomas Zimmermann |
f023a6 |
1 file changed, 18 insertions(+), 6 deletions(-)
|
|
Thomas Zimmermann |
f023a6 |
|
|
Thomas Zimmermann |
f023a6 |
--- a/drivers/video/fbdev/amba-clcd.c
|
|
Thomas Zimmermann |
f023a6 |
+++ b/drivers/video/fbdev/amba-clcd.c
|
|
Thomas Zimmermann |
f023a6 |
@@ -772,8 +772,10 @@ static int clcdfb_of_init_display(struct
|
|
Thomas Zimmermann |
f023a6 |
return -ENODEV;
|
|
Thomas Zimmermann |
f023a6 |
|
|
Thomas Zimmermann |
f023a6 |
panel = of_graph_get_remote_port_parent(endpoint);
|
|
Thomas Zimmermann |
f023a6 |
- if (!panel)
|
|
Thomas Zimmermann |
f023a6 |
- return -ENODEV;
|
|
Thomas Zimmermann |
f023a6 |
+ if (!panel) {
|
|
Thomas Zimmermann |
f023a6 |
+ err = -ENODEV;
|
|
Thomas Zimmermann |
f023a6 |
+ goto out_endpoint_put;
|
|
Thomas Zimmermann |
f023a6 |
+ }
|
|
Thomas Zimmermann |
f023a6 |
|
|
Thomas Zimmermann |
f023a6 |
if (fb->vendor->init_panel) {
|
|
Thomas Zimmermann |
f023a6 |
err = fb->vendor->init_panel(fb, panel);
|
|
Thomas Zimmermann |
f023a6 |
@@ -783,11 +785,11 @@ static int clcdfb_of_init_display(struct
|
|
Thomas Zimmermann |
f023a6 |
|
|
Thomas Zimmermann |
f023a6 |
err = clcdfb_of_get_backlight(panel, fb->panel);
|
|
Thomas Zimmermann |
f023a6 |
if (err)
|
|
Thomas Zimmermann |
f023a6 |
- return err;
|
|
Thomas Zimmermann |
f023a6 |
+ goto out_panel_put;
|
|
Thomas Zimmermann |
f023a6 |
|
|
Thomas Zimmermann |
f023a6 |
err = clcdfb_of_get_mode(&fb->dev->dev, panel, fb->panel);
|
|
Thomas Zimmermann |
f023a6 |
if (err)
|
|
Thomas Zimmermann |
f023a6 |
- return err;
|
|
Thomas Zimmermann |
f023a6 |
+ goto out_panel_put;
|
|
Thomas Zimmermann |
f023a6 |
|
|
Thomas Zimmermann |
f023a6 |
err = of_property_read_u32(fb->dev->dev.of_node, "max-memory-bandwidth",
|
|
Thomas Zimmermann |
f023a6 |
&max_bandwidth);
|
|
Thomas Zimmermann |
f023a6 |
@@ -816,11 +818,21 @@ static int clcdfb_of_init_display(struct
|
|
Thomas Zimmermann |
f023a6 |
|
|
Thomas Zimmermann |
f023a6 |
if (of_property_read_u32_array(endpoint,
|
|
Thomas Zimmermann |
f023a6 |
"arm,pl11x,tft-r0g0b0-pads",
|
|
Thomas Zimmermann |
f023a6 |
- tft_r0b0g0, ARRAY_SIZE(tft_r0b0g0)) != 0)
|
|
Thomas Zimmermann |
f023a6 |
- return -ENOENT;
|
|
Thomas Zimmermann |
f023a6 |
+ tft_r0b0g0, ARRAY_SIZE(tft_r0b0g0)) != 0) {
|
|
Thomas Zimmermann |
f023a6 |
+ err = -ENOENT;
|
|
Thomas Zimmermann |
f023a6 |
+ goto out_panel_put;
|
|
Thomas Zimmermann |
f023a6 |
+ }
|
|
Thomas Zimmermann |
f023a6 |
+
|
|
Thomas Zimmermann |
f023a6 |
+ of_node_put(panel);
|
|
Thomas Zimmermann |
f023a6 |
+ of_node_put(endpoint);
|
|
Thomas Zimmermann |
f023a6 |
|
|
Thomas Zimmermann |
f023a6 |
return clcdfb_of_init_tft_panel(fb, tft_r0b0g0[0],
|
|
Thomas Zimmermann |
f023a6 |
tft_r0b0g0[1], tft_r0b0g0[2]);
|
|
Thomas Zimmermann |
f023a6 |
+out_panel_put:
|
|
Thomas Zimmermann |
f023a6 |
+ of_node_put(panel);
|
|
Thomas Zimmermann |
f023a6 |
+out_endpoint_put:
|
|
Thomas Zimmermann |
f023a6 |
+ of_node_put(endpoint);
|
|
Thomas Zimmermann |
f023a6 |
+ return err;
|
|
Thomas Zimmermann |
f023a6 |
}
|
|
Thomas Zimmermann |
f023a6 |
|
|
Thomas Zimmermann |
f023a6 |
static int clcdfb_of_vram_setup(struct clcd_fb *fb)
|