Commit 579b2b45 authored by Jonathan Nieder's avatar Jonathan Nieder Committed by Mauro Carvalho Chehab

[media] cx88: gracefully reject attempts to use unregistered cx88-blackbird driver

It should not be possible to enter mpeg_open and acquire core->lock
without the blackbird driver being registered, so just error out if it
is not.  This makes the code more readable and should prevent the bug
fixed by the patch "hold device lock during sub-driver initialization"
from resurfacing again.

Similarly, if we enter mpeg_release and acquire core->lock then either
the blackbird driver is registered (since open files keep it loaded)
or the sysadmin forced the driver's removal.  In the latter case the
state will be inconsistent and this is worth a loud warning.
Tested-by: default avatarAndi Huber <hobrom@gmx.at>
Tested-by: default avatarMarlon de Boer <marlon@hyves.nl>
Signed-off-by: default avatarJonathan Nieder <jrnieder@gmail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 344d6c6b
...@@ -1060,18 +1060,21 @@ static int mpeg_open(struct file *file) ...@@ -1060,18 +1060,21 @@ static int mpeg_open(struct file *file)
/* Make sure we can acquire the hardware */ /* Make sure we can acquire the hardware */
drv = cx8802_get_driver(dev, CX88_MPEG_BLACKBIRD); drv = cx8802_get_driver(dev, CX88_MPEG_BLACKBIRD);
if (drv) { if (!drv) {
err = drv->request_acquire(drv); dprintk(1, "%s: blackbird driver is not loaded\n", __func__);
if(err != 0) { mutex_unlock(&dev->core->lock);
dprintk(1,"%s: Unable to acquire hardware, %d\n", __func__, err); return -ENODEV;
mutex_unlock(&dev->core->lock); }
return err;
} err = drv->request_acquire(drv);
if (err != 0) {
dprintk(1,"%s: Unable to acquire hardware, %d\n", __func__, err);
mutex_unlock(&dev->core->lock);
return err;
} }
if (!atomic_read(&dev->core->mpeg_users) && blackbird_initialize_codec(dev) < 0) { if (!atomic_read(&dev->core->mpeg_users) && blackbird_initialize_codec(dev) < 0) {
if (drv) drv->request_release(drv);
drv->request_release(drv);
mutex_unlock(&dev->core->lock); mutex_unlock(&dev->core->lock);
return -EINVAL; return -EINVAL;
} }
...@@ -1080,8 +1083,7 @@ static int mpeg_open(struct file *file) ...@@ -1080,8 +1083,7 @@ static int mpeg_open(struct file *file)
/* allocate + initialize per filehandle data */ /* allocate + initialize per filehandle data */
fh = kzalloc(sizeof(*fh),GFP_KERNEL); fh = kzalloc(sizeof(*fh),GFP_KERNEL);
if (NULL == fh) { if (NULL == fh) {
if (drv) drv->request_release(drv);
drv->request_release(drv);
mutex_unlock(&dev->core->lock); mutex_unlock(&dev->core->lock);
return -ENOMEM; return -ENOMEM;
} }
...@@ -1125,6 +1127,7 @@ static int mpeg_release(struct file *file) ...@@ -1125,6 +1127,7 @@ static int mpeg_release(struct file *file)
/* Make sure we release the hardware */ /* Make sure we release the hardware */
drv = cx8802_get_driver(dev, CX88_MPEG_BLACKBIRD); drv = cx8802_get_driver(dev, CX88_MPEG_BLACKBIRD);
WARN_ON(!drv);
if (drv) if (drv)
drv->request_release(drv); drv->request_release(drv);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment