diff options
author | Simon Arlott <simon@fire.lp0.eu> | 2009-05-12 16:39:28 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-06-16 17:21:10 -0400 |
commit | eda9f7523b6760bdfc3b9c5001214467b5ecd618 (patch) | |
tree | bedaac0621dfdabfdf9d5bd0c4f0a37590d5e4de /drivers/media/dvb/dvb-core | |
parent | 1010ed132727bbf486ac28fd149ccfb0ef5cd2ab (diff) |
V4L/DVB (11841): core: fix potential mutex_unlock without mutex_lock in dvb_dvr_read
dvb_dvr_read may unlock the dmxdev mutex and return -ENODEV, except this
function is a file op and will never be called with the mutex held.
There's existing mutex_lock and mutex_unlock around the actual read but
it's commented out. These should probably be uncommented but the read
blocks and this could block another non-blocking reader on the mutex
instead.
This change comments out the extra mutex_unlock.
[akpm@linux-foundation.org: cleanups, simplification]
Signed-off-by: Simon Arlott <simon@fire.lp0.eu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb/dvb-core')
-rw-r--r-- | drivers/media/dvb/dvb-core/dmxdev.c | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/drivers/media/dvb/dvb-core/dmxdev.c b/drivers/media/dvb/dvb-core/dmxdev.c index c35fbb8d8f4a..6d6121eb5d59 100644 --- a/drivers/media/dvb/dvb-core/dmxdev.c +++ b/drivers/media/dvb/dvb-core/dmxdev.c | |||
@@ -244,19 +244,13 @@ static ssize_t dvb_dvr_read(struct file *file, char __user *buf, size_t count, | |||
244 | { | 244 | { |
245 | struct dvb_device *dvbdev = file->private_data; | 245 | struct dvb_device *dvbdev = file->private_data; |
246 | struct dmxdev *dmxdev = dvbdev->priv; | 246 | struct dmxdev *dmxdev = dvbdev->priv; |
247 | int ret; | ||
248 | 247 | ||
249 | if (dmxdev->exit) { | 248 | if (dmxdev->exit) |
250 | mutex_unlock(&dmxdev->mutex); | ||
251 | return -ENODEV; | 249 | return -ENODEV; |
252 | } | ||
253 | 250 | ||
254 | //mutex_lock(&dmxdev->mutex); | 251 | return dvb_dmxdev_buffer_read(&dmxdev->dvr_buffer, |
255 | ret = dvb_dmxdev_buffer_read(&dmxdev->dvr_buffer, | 252 | file->f_flags & O_NONBLOCK, |
256 | file->f_flags & O_NONBLOCK, | 253 | buf, count, ppos); |
257 | buf, count, ppos); | ||
258 | //mutex_unlock(&dmxdev->mutex); | ||
259 | return ret; | ||
260 | } | 254 | } |
261 | 255 | ||
262 | static int dvb_dvr_set_buffer_size(struct dmxdev *dmxdev, | 256 | static int dvb_dvr_set_buffer_size(struct dmxdev *dmxdev, |