Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm: panel-lvds: Potential Oops in probe error handling

The "lvds->backlight" pointer could be NULL in situations where
of_parse_phandle() returns NULL. This code is cleaner if we use the
managed devm_of_find_backlight() so the clean up is automatic.

Fixes: 7c9dff5bd643 ("drm: panels: Add LVDS panel driver")
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20190911104928.GA15930@mwanda

authored by

Dan Carpenter and committed by
Sam Ravnborg
fb2ee9bf 21185a66

+4 -17
+4 -17
drivers/gpu/drm/panel/panel-lvds.c
··· 197 197 static int panel_lvds_probe(struct platform_device *pdev) 198 198 { 199 199 struct panel_lvds *lvds; 200 - struct device_node *np; 201 200 int ret; 202 201 203 202 lvds = devm_kzalloc(&pdev->dev, sizeof(*lvds), GFP_KERNEL); ··· 242 243 return ret; 243 244 } 244 245 245 - np = of_parse_phandle(lvds->dev->of_node, "backlight", 0); 246 - if (np) { 247 - lvds->backlight = of_find_backlight_by_node(np); 248 - of_node_put(np); 249 - 250 - if (!lvds->backlight) 251 - return -EPROBE_DEFER; 252 - } 246 + lvds->backlight = devm_of_find_backlight(lvds->dev); 247 + if (IS_ERR(lvds->backlight)) 248 + return PTR_ERR(lvds->backlight); 253 249 254 250 /* 255 251 * TODO: Handle all power supplies specified in the DT node in a generic ··· 259 265 260 266 ret = drm_panel_add(&lvds->panel); 261 267 if (ret < 0) 262 - goto error; 268 + return ret; 263 269 264 270 dev_set_drvdata(lvds->dev, lvds); 265 271 return 0; 266 - 267 - error: 268 - put_device(&lvds->backlight->dev); 269 - return ret; 270 272 } 271 273 272 274 static int panel_lvds_remove(struct platform_device *pdev) ··· 272 282 drm_panel_remove(&lvds->panel); 273 283 274 284 panel_lvds_disable(&lvds->panel); 275 - 276 - if (lvds->backlight) 277 - put_device(&lvds->backlight->dev); 278 285 279 286 return 0; 280 287 }