Commit 64ff9ba5 authored by Guennadi Liakhovetski's avatar Guennadi Liakhovetski Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (13344): soc-camera: properly initialise the device object when reusing



Commit ef373189f62413803b7b816c972fc154c488cdc0 "fix use-after-free Oops,
resulting from a driver-core API change" fixed the Oops, but didn't correct
missing device object initialisation. This patch makes unloading and reloading
of soc-camera host- and client-drivers possible again.

Signed-off-by: default avatarGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent f39c1ab3
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -1097,6 +1097,13 @@ static int default_s_crop(struct soc_camera_device *icd, struct v4l2_crop *a)
	return v4l2_subdev_call(sd, video, s_crop, a);
}

static void soc_camera_device_init(struct device *dev, void *pdata)
{
	dev->platform_data	= pdata;
	dev->bus		= &soc_camera_bus_type;
	dev->release		= dummy_release;
}

int soc_camera_host_register(struct soc_camera_host *ici)
{
	struct soc_camera_host *ix;
@@ -1158,6 +1165,7 @@ void soc_camera_host_unregister(struct soc_camera_host *ici)

	list_for_each_entry(icd, &devices, list) {
		if (icd->iface == ici->nr) {
			void *pdata = icd->dev.platform_data;
			/* The bus->remove will be called */
			device_unregister(&icd->dev);
			/*
@@ -1169,6 +1177,7 @@ void soc_camera_host_unregister(struct soc_camera_host *ici)
			 * device private data.
			 */
			memset(&icd->dev, 0, sizeof(icd->dev));
			soc_camera_device_init(&icd->dev, pdata);
		}
	}

@@ -1201,9 +1210,6 @@ static int soc_camera_device_register(struct soc_camera_device *icd)
		return -ENOMEM;

	icd->devnum		= num;
	icd->dev.bus = &soc_camera_bus_type;

	icd->dev.release	= dummy_release;
	icd->use_count		= 0;
	icd->host_priv		= NULL;
	mutex_init(&icd->video_lock);
@@ -1311,12 +1317,13 @@ static int __devinit soc_camera_pdrv_probe(struct platform_device *pdev)
	icd->iface = icl->bus_id;
	icd->pdev = &pdev->dev;
	platform_set_drvdata(pdev, icd);
	icd->dev.platform_data = icl;

	ret = soc_camera_device_register(icd);
	if (ret < 0)
		goto escdevreg;

	soc_camera_device_init(&icd->dev, icl);

	icd->user_width		= DEFAULT_WIDTH;
	icd->user_height	= DEFAULT_HEIGHT;