Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d2f7a1a2 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

[media] vpif_capture.c: v4l2_device_register() is called too late in vpif_probe()



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.

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: default avatarGeorgios Plakaris <gplakari@cisco.com>
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Acked-by: default avatarManjunath Hadli <Manjunath.hadli@ti.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent bb0a896e
Loading
Loading
Loading
Loading
+7 −7
Original line number Original line Diff line number Diff line
@@ -2177,6 +2177,12 @@ static __init int vpif_probe(struct platform_device *pdev)
		return err;
		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;
	k = 0;
	while ((res = platform_get_resource(pdev, IORESOURCE_IRQ, k))) {
	while ((res = platform_get_resource(pdev, IORESOURCE_IRQ, k))) {
		for (i = res->start; i <= res->end; i++) {
		for (i = res->start; i <= res->end; i++) {
@@ -2246,12 +2252,6 @@ static __init int vpif_probe(struct platform_device *pdev)
		goto probe_out;
		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++) {
	for (i = 0; i < subdev_count; i++) {
		subdevdata = &config->subdev_info[i];
		subdevdata = &config->subdev_info[i];
		vpif_obj.sd[i] =
		vpif_obj.sd[i] =
@@ -2281,7 +2281,6 @@ static __init int vpif_probe(struct platform_device *pdev)


	j = VPIF_CAPTURE_MAX_DEVICES;
	j = VPIF_CAPTURE_MAX_DEVICES;
probe_out:
probe_out:
	v4l2_device_unregister(&vpif_obj.v4l2_dev);
	for (k = 0; k < j; k++) {
	for (k = 0; k < j; k++) {
		/* Get the pointer to the channel object */
		/* Get the pointer to the channel object */
		ch = vpif_obj.dev[k];
		ch = vpif_obj.dev[k];
@@ -2303,6 +2302,7 @@ static __init int vpif_probe(struct platform_device *pdev)
		if (res)
		if (res)
			i = res->end;
			i = res->end;
	}
	}
	v4l2_device_unregister(&vpif_obj.v4l2_dev);
	return err;
	return err;
}
}