Re: small patch: enable pwc usb camera driver

From: Kai Engert
Date: Thu Jun 17 2004 - 07:38:38 EST


Greg KH wrote:
On Tue, Jun 08, 2004 at 12:27:04AM +0200, Nemosoft Unv. wrote:
... Don't use this. It will BUG() your kernel hard, because of a double free().

I confirm, if you disconnect the device / unload the driver, it doesn't take long and the kernel reports an exception. My fault, sorry.

... I'll wait for someone to send another patch fixing this one ...

I'm attaching a new patch:

- revert video device release code to original no-op,
using correct function signature.

With this patch applied to 2.6.7, I am able to connect/disconnect the camera, load/unload the driver 20 times and everything still works fine.

No warnings during compilation (which was the original reason to mark the driver broken, IIUC).

Thanks and Regards,
Kai
diff -ruw org-267/drivers/usb/media/pwc-if.c linux-2.6.7/drivers/usb/media/pwc-if.c
--- org-267/drivers/usb/media/pwc-if.c 2004-06-16 07:19:44.000000000 +0200
+++ linux-2.6.7/drivers/usb/media/pwc-if.c 2004-06-17 13:49:58.268336544 +0200
@@ -129,6 +129,7 @@

static int pwc_video_open(struct inode *inode, struct file *file);
static int pwc_video_close(struct inode *inode, struct file *file);
+static void pwc_video_release(struct video_device *);
static ssize_t pwc_video_read(struct file *file, char *buf,
size_t count, loff_t *ppos);
static unsigned int pwc_video_poll(struct file *file, poll_table *wait);
@@ -1120,6 +1121,12 @@
return 0;
}

+static void pwc_video_release(struct video_device *vfd)
+{
+ /* Do nothing to prevent a double free */
+ Trace(TRACE_OPEN, "pwc_video_release() called.\n");
+}
+
/*
* FIXME: what about two parallel reads ????
* ANSWER: Not supported. You can't open the device more than once,
@@ -1848,7 +1855,7 @@
}
}

- pdev->vdev.release = video_device_release;
+ pdev->vdev.release = pwc_video_release;
i = video_register_device(&pdev->vdev, VFL_TYPE_GRABBER, video_nr);
if (i < 0) {
Err("Failed to register as video device (%d).\n", i);