aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDean Anderson <dean@sensoray.com>2010-04-08 22:40:31 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-05-19 11:57:23 -0400
commitc0a2ec956d6e61081b6f98b839b0e28979941687 (patch)
tree1df165fa55fd8f1880c9e77ba66e2fbf625dfeb6
parentab85c6a33c7168cc42ce12ac3335c2f12d5a8d22 (diff)
V4L/DVB: s2255drv: video_device_alloc call not checked fix
call to video_device_alloc was not being checked in probe function. code simplified and uses video_device inside device structure. Signed-off-by: Dean Anderson <dean@sensoray.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/video/s2255drv.c42
1 files changed, 20 insertions, 22 deletions
diff --git a/drivers/media/video/s2255drv.c b/drivers/media/video/s2255drv.c
index 91f7e9538f6e..4c5d3672e2db 100644
--- a/drivers/media/video/s2255drv.c
+++ b/drivers/media/video/s2255drv.c
@@ -224,6 +224,7 @@ struct s2255_pipeinfo {
224struct s2255_fmt; /*forward declaration */ 224struct s2255_fmt; /*forward declaration */
225 225
226struct s2255_dev { 226struct s2255_dev {
227 struct video_device vdev[MAX_CHANNELS];
227 int frames; 228 int frames;
228 struct mutex lock; 229 struct mutex lock;
229 struct mutex open_lock; 230 struct mutex open_lock;
@@ -233,7 +234,6 @@ struct s2255_dev {
233 u8 read_endpoint; 234 u8 read_endpoint;
234 235
235 struct s2255_dmaqueue vidq[MAX_CHANNELS]; 236 struct s2255_dmaqueue vidq[MAX_CHANNELS];
236 struct video_device *vdev[MAX_CHANNELS];
237 struct timer_list timer; 237 struct timer_list timer;
238 struct s2255_fw *fw_data; 238 struct s2255_fw *fw_data;
239 struct s2255_pipeinfo pipe; 239 struct s2255_pipeinfo pipe;
@@ -719,10 +719,10 @@ static int buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
719 if (fh->fmt == NULL) 719 if (fh->fmt == NULL)
720 return -EINVAL; 720 return -EINVAL;
721 721
722 if ((fh->width < norm_minw(fh->dev->vdev[fh->channel])) || 722 if ((fh->width < norm_minw(&fh->dev->vdev[fh->channel])) ||
723 (fh->width > norm_maxw(fh->dev->vdev[fh->channel])) || 723 (fh->width > norm_maxw(&fh->dev->vdev[fh->channel])) ||
724 (fh->height < norm_minh(fh->dev->vdev[fh->channel])) || 724 (fh->height < norm_minh(&fh->dev->vdev[fh->channel])) ||
725 (fh->height > norm_maxh(fh->dev->vdev[fh->channel]))) { 725 (fh->height > norm_maxh(&fh->dev->vdev[fh->channel]))) {
726 dprintk(4, "invalid buffer prepare\n"); 726 dprintk(4, "invalid buffer prepare\n");
727 return -EINVAL; 727 return -EINVAL;
728 } 728 }
@@ -896,7 +896,7 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
896 int is_ntsc; 896 int is_ntsc;
897 897
898 is_ntsc = 898 is_ntsc =
899 (dev->vdev[fh->channel]->current_norm & V4L2_STD_NTSC) ? 1 : 0; 899 (dev->vdev[fh->channel].current_norm & V4L2_STD_NTSC) ? 1 : 0;
900 900
901 fmt = format_by_fourcc(f->fmt.pix.pixelformat); 901 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
902 902
@@ -1029,9 +1029,9 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
1029 fh->height = f->fmt.pix.height; 1029 fh->height = f->fmt.pix.height;
1030 fh->vb_vidq.field = f->fmt.pix.field; 1030 fh->vb_vidq.field = f->fmt.pix.field;
1031 fh->type = f->type; 1031 fh->type = f->type;
1032 norm = norm_minw(fh->dev->vdev[fh->channel]); 1032 norm = norm_minw(&fh->dev->vdev[fh->channel]);
1033 if (fh->width > norm_minw(fh->dev->vdev[fh->channel])) { 1033 if (fh->width > norm_minw(&fh->dev->vdev[fh->channel])) {
1034 if (fh->height > norm_minh(fh->dev->vdev[fh->channel])) { 1034 if (fh->height > norm_minh(&fh->dev->vdev[fh->channel])) {
1035 if (fh->dev->cap_parm[fh->channel].capturemode & 1035 if (fh->dev->cap_parm[fh->channel].capturemode &
1036 V4L2_MODE_HIGHQUALITY) { 1036 V4L2_MODE_HIGHQUALITY) {
1037 fh->mode.scale = SCALE_4CIFSI; 1037 fh->mode.scale = SCALE_4CIFSI;
@@ -1755,7 +1755,7 @@ static int s2255_open(struct file *file)
1755 video_device_node_name(vdev)); 1755 video_device_node_name(vdev));
1756 lock_kernel(); 1756 lock_kernel();
1757 for (i = 0; i < MAX_CHANNELS; i++) 1757 for (i = 0; i < MAX_CHANNELS; i++)
1758 if (dev->vdev[i] == vdev) { 1758 if (&dev->vdev[i] == vdev) {
1759 cur_channel = i; 1759 cur_channel = i;
1760 break; 1760 break;
1761 } 1761 }
@@ -1985,7 +1985,6 @@ static const struct v4l2_ioctl_ops s2255_ioctl_ops = {
1985static void s2255_video_device_release(struct video_device *vdev) 1985static void s2255_video_device_release(struct video_device *vdev)
1986{ 1986{
1987 struct s2255_dev *dev = video_get_drvdata(vdev); 1987 struct s2255_dev *dev = video_get_drvdata(vdev);
1988 video_device_release(vdev);
1989 kref_put(&dev->kref, s2255_destroy); 1988 kref_put(&dev->kref, s2255_destroy);
1990 return; 1989 return;
1991} 1990}
@@ -2012,19 +2011,18 @@ static int s2255_probe_v4l(struct s2255_dev *dev)
2012 dev->vidq[i].dev = dev; 2011 dev->vidq[i].dev = dev;
2013 dev->vidq[i].channel = i; 2012 dev->vidq[i].channel = i;
2014 /* register 4 video devices */ 2013 /* register 4 video devices */
2015 dev->vdev[i] = video_device_alloc(); 2014 memcpy(&dev->vdev[i], &template, sizeof(struct video_device));
2016 memcpy(dev->vdev[i], &template, sizeof(struct video_device)); 2015 dev->vdev[i].parent = &dev->interface->dev;
2017 dev->vdev[i]->parent = &dev->interface->dev; 2016 video_set_drvdata(&dev->vdev[i], dev);
2018 video_set_drvdata(dev->vdev[i], dev);
2019 if (video_nr == -1) 2017 if (video_nr == -1)
2020 ret = video_register_device(dev->vdev[i], 2018 ret = video_register_device(&dev->vdev[i],
2021 VFL_TYPE_GRABBER, 2019 VFL_TYPE_GRABBER,
2022 video_nr); 2020 video_nr);
2023 else 2021 else
2024 ret = video_register_device(dev->vdev[i], 2022 ret = video_register_device(&dev->vdev[i],
2025 VFL_TYPE_GRABBER, 2023 VFL_TYPE_GRABBER,
2026 cur_nr + i); 2024 cur_nr + i);
2027 video_set_drvdata(dev->vdev[i], dev); 2025 video_set_drvdata(&dev->vdev[i], dev);
2028 2026
2029 if (ret != 0) { 2027 if (ret != 0) {
2030 dev_err(&dev->udev->dev, 2028 dev_err(&dev->udev->dev,
@@ -2721,8 +2719,8 @@ static int s2255_probe(struct usb_interface *interface,
2721 return 0; 2719 return 0;
2722errorV4L: 2720errorV4L:
2723 for (i = 0; i < MAX_CHANNELS; i++) 2721 for (i = 0; i < MAX_CHANNELS; i++)
2724 if (dev->vdev[i] && video_is_registered(dev->vdev[i])) 2722 if (video_is_registered(&dev->vdev[i]))
2725 video_unregister_device(dev->vdev[i]); 2723 video_unregister_device(&dev->vdev[i]);
2726errorBOARDINIT: 2724errorBOARDINIT:
2727 s2255_board_shutdown(dev); 2725 s2255_board_shutdown(dev);
2728errorFWMARKER: 2726errorFWMARKER:
@@ -2755,8 +2753,8 @@ static void s2255_disconnect(struct usb_interface *interface)
2755 dev = usb_get_intfdata(interface); 2753 dev = usb_get_intfdata(interface);
2756 /* unregister each video device. */ 2754 /* unregister each video device. */
2757 for (i = 0; i < MAX_CHANNELS; i++) 2755 for (i = 0; i < MAX_CHANNELS; i++)
2758 if (video_is_registered(dev->vdev[i])) 2756 if (video_is_registered(&dev->vdev[i]))
2759 video_unregister_device(dev->vdev[i]); 2757 video_unregister_device(&dev->vdev[i]);
2760 /* wake up any of our timers */ 2758 /* wake up any of our timers */
2761 atomic_set(&dev->fw_data->fw_state, S2255_FW_DISCONNECTING); 2759 atomic_set(&dev->fw_data->fw_state, S2255_FW_DISCONNECTING);
2762 wake_up(&dev->fw_data->wait_fw); 2760 wake_up(&dev->fw_data->wait_fw);