Skip to content

Commit e07a1d8

Browse files
moinejfMauro Carvalho Chehab
authored andcommitted
V4L/DVB (9691): gspca: Move the video device to a separate area.
The video device was part of the gspca device. On device disconnection while streaming, the device structure is freed at close time. In this case, the remaining close job on the video device run out of allocated memory. Signed-off-by: Jean-Francois Moine <[email protected]> Signed-off-by: Mauro Carvalho Chehab <[email protected]>
1 parent 5c4fa00 commit e07a1d8

File tree

2 files changed

+14
-16
lines changed

2 files changed

+14
-16
lines changed

drivers/media/video/gspca/gspca.c

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -862,7 +862,7 @@ static int dev_open(struct inode *inode, struct file *file)
862862
int ret;
863863

864864
PDEBUG(D_STREAM, "%s open", current->comm);
865-
gspca_dev = (struct gspca_dev *) video_devdata(file);
865+
gspca_dev = video_drvdata(file);
866866
if (mutex_lock_interruptible(&gspca_dev->queue_lock))
867867
return -ERESTARTSYS;
868868
if (!gspca_dev->present) {
@@ -890,10 +890,10 @@ static int dev_open(struct inode *inode, struct file *file)
890890
#ifdef GSPCA_DEBUG
891891
/* activate the v4l2 debug */
892892
if (gspca_debug & D_V4L2)
893-
gspca_dev->vdev.debug |= V4L2_DEBUG_IOCTL
893+
gspca_dev->vdev->debug |= V4L2_DEBUG_IOCTL
894894
| V4L2_DEBUG_IOCTL_ARG;
895895
else
896-
gspca_dev->vdev.debug &= ~(V4L2_DEBUG_IOCTL
896+
gspca_dev->vdev->debug &= ~(V4L2_DEBUG_IOCTL
897897
| V4L2_DEBUG_IOCTL_ARG);
898898
#endif
899899
ret = 0;
@@ -1755,11 +1755,6 @@ static ssize_t dev_read(struct file *file, char __user *data,
17551755
return ret;
17561756
}
17571757

1758-
static void dev_release(struct video_device *vfd)
1759-
{
1760-
/* nothing */
1761-
}
1762-
17631758
static struct file_operations dev_fops = {
17641759
.owner = THIS_MODULE,
17651760
.open = dev_open,
@@ -1807,7 +1802,7 @@ static struct video_device gspca_template = {
18071802
.name = "gspca main driver",
18081803
.fops = &dev_fops,
18091804
.ioctl_ops = &dev_ioctl_ops,
1810-
.release = dev_release, /* mandatory */
1805+
.release = video_device_release,
18111806
.minor = -1,
18121807
};
18131808

@@ -1876,24 +1871,27 @@ int gspca_dev_probe(struct usb_interface *intf,
18761871
init_waitqueue_head(&gspca_dev->wq);
18771872

18781873
/* init video stuff */
1879-
memcpy(&gspca_dev->vdev, &gspca_template, sizeof gspca_template);
1880-
gspca_dev->vdev.parent = &dev->dev;
1881-
gspca_dev->vdev.fops = &dev_fops;
1874+
gspca_dev->vdev = video_device_alloc();
1875+
memcpy(gspca_dev->vdev, &gspca_template, sizeof gspca_template);
1876+
gspca_dev->vdev->parent = &dev->dev;
18821877
gspca_dev->module = module;
18831878
gspca_dev->present = 1;
1884-
ret = video_register_device(&gspca_dev->vdev,
1879+
video_set_drvdata(gspca_dev->vdev, gspca_dev);
1880+
ret = video_register_device(gspca_dev->vdev,
18851881
VFL_TYPE_GRABBER,
18861882
video_nr);
18871883
if (ret < 0) {
18881884
err("video_register_device err %d", ret);
1885+
video_device_release(gspca_dev->vdev);
18891886
goto out;
18901887
}
18911888

18921889
usb_set_intfdata(intf, gspca_dev);
18931890
PDEBUG(D_PROBE, "probe ok");
18941891
return 0;
18951892
out:
1896-
kref_put(&gspca_dev->kref, gspca_delete);
1893+
kfree(gspca_dev->usb_buf);
1894+
kfree(gspca_dev);
18971895
return ret;
18981896
}
18991897
EXPORT_SYMBOL(gspca_dev_probe);
@@ -1911,7 +1909,7 @@ void gspca_disconnect(struct usb_interface *intf)
19111909
usb_set_intfdata(intf, NULL);
19121910

19131911
/* We don't want people trying to open up the device */
1914-
video_unregister_device(&gspca_dev->vdev);
1912+
video_unregister_device(gspca_dev->vdev);
19151913

19161914
gspca_dev->present = 0;
19171915
gspca_dev->streaming = 0;

drivers/media/video/gspca/gspca.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ struct gspca_frame {
120120
};
121121

122122
struct gspca_dev {
123-
struct video_device vdev; /* !! must be the first item */
123+
struct video_device *vdev;
124124
struct module *module; /* subdriver handling the device */
125125
struct usb_device *dev;
126126
struct kref kref;

0 commit comments

Comments
 (0)