media: vimc: sen: register subdevice only after initialization
authorDafna Hirschfeld <dafna.hirschfeld@collabora.com>
Mon, 7 Oct 2019 13:50:01 +0000 (10:50 -0300)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Thu, 24 Oct 2019 22:00:38 +0000 (19:00 -0300)
vimc_sen_add function first registers the subdevice and then
calls tpg_alloc. If tpg_alloc fails it unregisters the subdevice
and then frees vsen, this cause double free since the release
callback that follows subdevice unregistration also frees vsen.

Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>
Acked-by: Helen Koike <helen.koike@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/platform/vimc/vimc-sensor.c

index 46dc6a5..ee2306c 100644 (file)
@@ -358,6 +358,13 @@ struct vimc_ent_device *vimc_sen_add(struct vimc_device *vimc,
                goto err_free_vsen;
        }
 
+       /* Initialize the test pattern generator */
+       tpg_init(&vsen->tpg, vsen->mbus_format.width,
+                vsen->mbus_format.height);
+       ret = tpg_alloc(&vsen->tpg, VIMC_FRAME_MAX_WIDTH);
+       if (ret)
+               goto err_free_hdl;
+
        /* Initialize ved and sd */
        ret = vimc_ent_sd_register(&vsen->ved, &vsen->sd, v4l2_dev,
                                   vcfg_name,
@@ -365,7 +372,7 @@ struct vimc_ent_device *vimc_sen_add(struct vimc_device *vimc,
                                   (const unsigned long[1]) {MEDIA_PAD_FL_SOURCE},
                                   &vimc_sen_int_ops, &vimc_sen_ops);
        if (ret)
-               goto err_free_hdl;
+               goto err_free_tpg;
 
        vsen->ved.process_frame = vimc_sen_process_frame;
        vsen->dev = &vimc->pdev.dev;
@@ -373,17 +380,10 @@ struct vimc_ent_device *vimc_sen_add(struct vimc_device *vimc,
        /* Initialize the frame format */
        vsen->mbus_format = fmt_default;
 
-       /* Initialize the test pattern generator */
-       tpg_init(&vsen->tpg, vsen->mbus_format.width,
-                vsen->mbus_format.height);
-       ret = tpg_alloc(&vsen->tpg, VIMC_FRAME_MAX_WIDTH);
-       if (ret)
-               goto err_unregister_ent_sd;
-
        return &vsen->ved;
 
-err_unregister_ent_sd:
-       vimc_ent_sd_unregister(&vsen->ved,  &vsen->sd);
+err_free_tpg:
+       tpg_free(&vsen->tpg);
 err_free_hdl:
        v4l2_ctrl_handler_free(&vsen->hdl);
 err_free_vsen: