]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
V4L/DVB (10218): cx23885: Fix Oops for mixed install of analog and digital only cards
authorAndy Walls <awalls@radix.net>
Sat, 10 Jan 2009 01:59:27 +0000 (22:59 -0300)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 23 Mar 2009 21:55:26 +0000 (14:55 -0700)
commit cd8f894eacf13996d920fdd2aef1afc55156b191 upstream.

Analog support for HVR-1250 has not been completed, but does exist for
the HVR-1800.

Since both cards use the same driver, it tries to create the analog
dev for both devices, which is not possible.

This causes a NULL error to show up in video_open and mpeg_open.

-Mark

Iterations through the cx23885_devlist must check for NULL
pointers as some supported devices only have DVB support at the moment.
Mark Jenks encoutered an Oops in a system with both an HVR-1250 and HVR-1800
installed.

-Andy

Reported-by: Mark Jenks <mjenks1968@gmail.com>
Tested-by: Mark Jenks <mjenks1968@gmail.com>
Signed-off-by: Mark Jenks <mjenks1968@gmail.com>
Signed-off-by: Andy Walls <awalls@radix.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Signed-off-by: Jarod Wilson <jarod@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/media/video/cx23885/cx23885-417.c
drivers/media/video/cx23885/cx23885-video.c

index 00831f3ef8f59b7f821d2281737987add37b74aa..c38857950301d021721575d3fc82cc0e6ae99ae8 100644 (file)
@@ -1585,7 +1585,8 @@ static int mpeg_open(struct inode *inode, struct file *file)
        lock_kernel();
        list_for_each(list, &cx23885_devlist) {
                h = list_entry(list, struct cx23885_dev, devlist);
-               if (h->v4l_device->minor == minor) {
+               if (h->v4l_device &&
+                   h->v4l_device->minor == minor) {
                        dev = h;
                        break;
                }
index c742a10be5cb2f9a94972b5f20d9eeb5ad355063..0aabc53c2d684e1935d51b4f949330a0e57bb180 100644 (file)
@@ -730,12 +730,13 @@ static int video_open(struct inode *inode, struct file *file)
        lock_kernel();
        list_for_each(list, &cx23885_devlist) {
                h = list_entry(list, struct cx23885_dev, devlist);
-               if (h->video_dev->minor == minor) {
+               if (h->video_dev &&
+                   h->video_dev->minor == minor) {
                        dev  = h;
                        type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                }
                if (h->vbi_dev &&
-                  h->vbi_dev->minor == minor) {
+                   h->vbi_dev->minor == minor) {
                        dev  = h;
                        type = V4L2_BUF_TYPE_VBI_CAPTURE;
                }