diff mbox

[7/7] drm/exynos/crtc: add NULL checks before accessing crtc

Message ID 1415896668-27226-8-git-send-email-a.hajda@samsung.com (mailing list archive)
State New, archived
Headers show

Commit Message

Andrzej Hajda Nov. 13, 2014, 4:37 p.m. UTC
exynos_drm_crtc_disable_vblank can be called when drm initialization fails.
In such case some structures are not initialized, so the function
should check it. The patch adds necessary checks.
It fixes following Oops:
[    1.521834] Unable to handle kernel NULL pointer dereference at virtual address 00000348
...
[    1.801740] [<c02687a0>] (exynos_drm_crtc_disable_vblank) from [<c0252200>] (vblank_disable_and_save+0x74/0x1e8)
[    1.811893] [<c0252200>] (vblank_disable_and_save) from [<c02535c0>] (drm_vblank_cleanup+0x50/0x80)
[    1.820918] [<c02535c0>] (drm_vblank_cleanup) from [<c026791c>] (exynos_drm_load+0xe8/0x118)
[    1.829338] [<c026791c>] (exynos_drm_load) from [<c025472c>] (drm_dev_register+0xa0/0x100)
[    1.837585] [<c025472c>] (drm_dev_register) from [<c02563a8>] (drm_platform_init+0x40/0xd0)
[    1.845919] [<c02563a8>] (drm_platform_init) from [<c0276968>] (try_to_bring_up_master.part.2+0xc8/0x104)
[    1.855467] [<c0276968>] (try_to_bring_up_master.part.2) from [<c0276a48>] (component_master_add_with_match+0xa4/0x124)
[    1.866227] [<c0276a48>] (component_master_add_with_match) from [<c0267a58>] (exynos_drm_platform_probe+0x10c/0x158)
[    1.876731] [<c0267a58>] (exynos_drm_platform_probe) from [<c027bc70>] (platform_drv_probe+0x48/0xa4)
[    1.885932] [<c027bc70>] (platform_drv_probe) from [<c027a840>] (driver_probe_device+0x10c/0x22c)
[    1.894784] [<c027a840>] (driver_probe_device) from [<c027a9ec>] (__driver_attach+0x8c/0x90)
[    1.903203] [<c027a9ec>] (__driver_attach) from [<c0279080>] (bus_for_each_dev+0x54/0x88)
[    1.911363] [<c0279080>] (bus_for_each_dev) from [<c027a040>] (bus_add_driver+0xd4/0x1d0)
[    1.919522] [<c027a040>] (bus_add_driver) from [<c027b014>] (driver_register+0x78/0xf4)
[    1.927507] [<c027b014>] (driver_register) from [<c0267b08>] (exynos_drm_init+0x64/0x8c)
[    1.935580] [<c0267b08>] (exynos_drm_init) from [<c0008924>] (do_one_initcall+0x80/0x1b8)
[    1.943743] [<c0008924>] (do_one_initcall) from [<c060cd40>] (kernel_init_freeable+0xfc/0x1c8)
[    1.952334] [<c060cd40>] (kernel_init_freeable) from [<c0447e04>] (kernel_init+0x8/0xec)
[    1.960406] [<c0447e04>] (kernel_init) from [<c000e738>] (ret_from_fork+0x14/0x3c)

Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
---
 drivers/gpu/drm/exynos/exynos_drm_crtc.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)
diff mbox

Patch

diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
index 45026e6..e05fe12 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
@@ -406,9 +406,14 @@  int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int pipe)
 void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int pipe)
 {
 	struct exynos_drm_private *private = dev->dev_private;
-	struct exynos_drm_crtc *exynos_crtc =
-		to_exynos_crtc(private->crtc[pipe]);
-	struct exynos_drm_manager *manager = exynos_crtc->manager;
+	struct exynos_drm_crtc *exynos_crtc;
+	struct exynos_drm_manager *manager;
+
+	if (!private->crtc[pipe])
+		return;
+
+	exynos_crtc = to_exynos_crtc(private->crtc[pipe]);
+	manager = exynos_crtc->manager;
 
 	if (exynos_crtc->dpms != DRM_MODE_DPMS_ON)
 		return;