Hans,

On Tue, Dec 13, 2011 at 15:14:42, Hans Verkuil wrote:
> The function v4l2_device_register() is called too late in vpif_probe().
> This meant that vpif_obj.v4l2_dev is accessed before it is initialized which 
> caused a crash.
> 
> This used to work in the past, but video_register_device() is now actually 
> using the v4l2_dev pointer.
I also found this issue today. Good catch!
> 
> Note that vpif_display.c doesn't have this bug, there v4l2_device_register() 
> is called at the beginning of vpif_probe.
> 
> Signed-off-by: Georgios Plakaris <gplak...@cisco.com>
> Signed-off-by: Hans Verkuil <hans.verk...@cisco.com>
> 
> diff --git a/drivers/media/video/davinci/vpif_capture.c 
> b/drivers/media/video/davinci/vpif_capture.c
> index 49e4deb..6504e40 100644
> --- a/drivers/media/video/davinci/vpif_capture.c
> +++ b/drivers/media/video/davinci/vpif_capture.c
> @@ -2177,6 +2177,12 @@ static __init int vpif_probe(struct platform_device 
> *pdev)
>               return err;
>       }
>  
> +     err = v4l2_device_register(vpif_dev, &vpif_obj.v4l2_dev);
> +     if (err) {
> +             v4l2_err(vpif_dev->driver, "Error registering v4l2 device\n");
> +             return err;
> +     }
> +
>       k = 0;
>       while ((res = platform_get_resource(pdev, IORESOURCE_IRQ, k))) {
>               for (i = res->start; i <= res->end; i++) { @@ -2246,12 +2252,6 
> @@ static __init int vpif_probe(struct platform_device *pdev)
>               goto probe_out;
>       }
>  
> -     err = v4l2_device_register(vpif_dev, &vpif_obj.v4l2_dev);
> -     if (err) {
> -             v4l2_err(vpif_dev->driver, "Error registering v4l2 device\n");
> -             goto probe_subdev_out;
> -     }
> -
>       for (i = 0; i < subdev_count; i++) {
>               subdevdata = &config->subdev_info[i];
>               vpif_obj.sd[i] =
> @@ -2281,7 +2281,6 @@ probe_subdev_out:
>  
>       j = VPIF_CAPTURE_MAX_DEVICES;
>  probe_out:
> -     v4l2_device_unregister(&vpif_obj.v4l2_dev);
>       for (k = 0; k < j; k++) {
>               /* Get the pointer to the channel object */
>               ch = vpif_obj.dev[k];
> @@ -2303,6 +2302,7 @@ vpif_int_err:
>               if (res)
>                       i = res->end;
>       }
> +     v4l2_device_unregister(&vpif_obj.v4l2_dev);
>       return err;
>  }
>  
> 
> 
> 

ACKed by me. <manjunath.ha...@ti.com>

Thx,
-Manju

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to