aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNickolay V. Shmyrev <nshmyrev@yandex.ru>2005-12-01 03:51:32 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2005-12-01 18:48:57 -0500
commit50ab5edc973c979e8f620e09d20b96761d271894 (patch)
tree7be7c4416bb650c1c1c0d5845c2f0369e9956b35
parent3b86b9999deb04bbfbb20e6b6fe1119a4bf0ff34 (diff)
[PATCH] V4L: Fix read() bugs in bttv driver
Fix read() bugs in bttv driver. Signed-off-by: Nickolay V. Shmyrev <nshmyrev@yandex.ru> Signed-off-by: Michael H. Schimek <mschimek@gmx.at> Signed-off-by: Mauro Carvalho Chehab <mchehab@brturbo.com.br> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--drivers/media/video/bttv-driver.c2
-rw-r--r--drivers/media/video/video-buf.c8
2 files changed, 7 insertions, 3 deletions
diff --git a/drivers/media/video/bttv-driver.c b/drivers/media/video/bttv-driver.c
index 5bc522259d36..f9d581cd31db 100644
--- a/drivers/media/video/bttv-driver.c
+++ b/drivers/media/video/bttv-driver.c
@@ -2952,6 +2952,8 @@ static unsigned int bttv_poll(struct file *file, poll_table *wait)
2952 fh->cap.read_buf->memory = V4L2_MEMORY_USERPTR; 2952 fh->cap.read_buf->memory = V4L2_MEMORY_USERPTR;
2953 field = videobuf_next_field(&fh->cap); 2953 field = videobuf_next_field(&fh->cap);
2954 if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,field)) { 2954 if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,field)) {
2955 kfree (fh->cap.read_buf);
2956 fh->cap.read_buf = NULL;
2955 up(&fh->cap.lock); 2957 up(&fh->cap.lock);
2956 return POLLERR; 2958 return POLLERR;
2957 } 2959 }
diff --git a/drivers/media/video/video-buf.c b/drivers/media/video/video-buf.c
index acfd3a103f35..bd34f81dbc69 100644
--- a/drivers/media/video/video-buf.c
+++ b/drivers/media/video/video-buf.c
@@ -753,10 +753,9 @@ videobuf_read_zerocopy(struct videobuf_queue *q, char __user *data,
753 int retval; 753 int retval;
754 754
755 /* setup stuff */ 755 /* setup stuff */
756 retval = -ENOMEM;
757 q->read_buf = videobuf_alloc(q->msize); 756 q->read_buf = videobuf_alloc(q->msize);
758 if (NULL == q->read_buf) 757 if (NULL == q->read_buf)
759 goto done; 758 return -ENOMEM;
760 759
761 q->read_buf->memory = V4L2_MEMORY_USERPTR; 760 q->read_buf->memory = V4L2_MEMORY_USERPTR;
762 q->read_buf->baddr = (unsigned long)data; 761 q->read_buf->baddr = (unsigned long)data;
@@ -819,8 +818,11 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
819 q->read_buf->memory = V4L2_MEMORY_USERPTR; 818 q->read_buf->memory = V4L2_MEMORY_USERPTR;
820 field = videobuf_next_field(q); 819 field = videobuf_next_field(q);
821 retval = q->ops->buf_prepare(q,q->read_buf,field); 820 retval = q->ops->buf_prepare(q,q->read_buf,field);
822 if (0 != retval) 821 if (0 != retval) {
822 kfree (q->read_buf);
823 q->read_buf = NULL;
823 goto done; 824 goto done;
825 }
824 spin_lock_irqsave(q->irqlock,flags); 826 spin_lock_irqsave(q->irqlock,flags);
825 q->ops->buf_queue(q,q->read_buf); 827 q->ops->buf_queue(q,q->read_buf);
826 spin_unlock_irqrestore(q->irqlock,flags); 828 spin_unlock_irqrestore(q->irqlock,flags);