Commit 4d741cbd authored by Seung-Woo Kim's avatar Seung-Woo Kim Committed by Mauro Carvalho Chehab

media: exynos4-is: fix wrong mdev and v4l2 dev order in error path

When driver is built as module and probe during insmod is deferred
because of sensor subdevs, there is NULL pointer deference because
mdev is cleaned up and then access it from v4l2_device_unregister().
Fix the wrong mdev and v4l2 dev order in error path of probe.

This fixes below null pointer deference:
   Unable to handle kernel NULL pointer dereference at virtual address 00000000
   pgd = ca026f68
   [00000000] *pgd=00000000
   Internal error: Oops: 5 [#1] PREEMPT SMP ARM
   [...]
   Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
   PC is at ida_free+0x7c/0x160
   LR is at xas_start+0x44/0x204
   [...]
   [<c0dafd60>] (ida_free) from [<c083c20c>] (__media_device_unregister_entity+0x18/0xc0)
   [<c083c20c>] (__media_device_unregister_entity) from [<c083c2e0>] (media_device_unregister_entity+0x2c/0x38)
   [<c083c2e0>] (media_device_unregister_entity) from [<c0843404>] (v4l2_device_release+0xd0/0x104)
   [<c0843404>] (v4l2_device_release) from [<c0632558>] (device_release+0x28/0x98)
   [<c0632558>] (device_release) from [<c0db1204>] (kobject_put+0xa4/0x208)
   [<c0db1204>] (kct_put) from [<bf00bac4>] (fimc_capture_subdev_unregistered+0x58/0x6c [s5p_fimc])
   [<bf00bac4>] (fimc_capture_subdev_unregistered [s5p_fimc]) from [<c084a1cc>] (v4l2_device_unregister_subdev+0x6c/0xa8)
   [<c084a1cc>] (v4l2_device_unregister_subdev) from [<c084a350>] (v4l2_device_unregister+0x64/0x94)
   [<c084a350>] (v4l2_device_unregister) from [<bf0101ac>] (fimc_md_probe+0x4ec/0xaf8 [s5p_fimc])
   [...]
Signed-off-by: default avatarSeung-Woo Kim <sw0312.kim@samsung.com>
Reviewed-by: default avatarSylwester Nawrocki <s.nawrocki@samsung.com>
Fixes: 9832e155 ("[media] media-device: split media initialization and registration")
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent 6dcd5d7a
...@@ -1457,12 +1457,12 @@ static int fimc_md_probe(struct platform_device *pdev) ...@@ -1457,12 +1457,12 @@ static int fimc_md_probe(struct platform_device *pdev)
ret = v4l2_device_register(dev, &fmd->v4l2_dev); ret = v4l2_device_register(dev, &fmd->v4l2_dev);
if (ret < 0) { if (ret < 0) {
v4l2_err(v4l2_dev, "Failed to register v4l2_device: %d\n", ret); v4l2_err(v4l2_dev, "Failed to register v4l2_device: %d\n", ret);
return ret; goto err_md;
} }
ret = fimc_md_get_clocks(fmd); ret = fimc_md_get_clocks(fmd);
if (ret) if (ret)
goto err_md; goto err_v4l2dev;
ret = fimc_md_get_pinctrl(fmd); ret = fimc_md_get_pinctrl(fmd);
if (ret < 0) { if (ret < 0) {
...@@ -1519,9 +1519,10 @@ static int fimc_md_probe(struct platform_device *pdev) ...@@ -1519,9 +1519,10 @@ static int fimc_md_probe(struct platform_device *pdev)
fimc_md_unregister_entities(fmd); fimc_md_unregister_entities(fmd);
err_clk: err_clk:
fimc_md_put_clocks(fmd); fimc_md_put_clocks(fmd);
err_v4l2dev:
v4l2_device_unregister(&fmd->v4l2_dev);
err_md: err_md:
media_device_cleanup(&fmd->media_dev); media_device_cleanup(&fmd->media_dev);
v4l2_device_unregister(&fmd->v4l2_dev);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment