diff mbox

media: vb2: add length check for mmap

Message ID 1365739077-8740-1-git-send-email-sw0312.kim@samsung.com (mailing list archive)
State New, archived
Headers show

Commit Message

Seung-Woo Kim April 12, 2013, 3:57 a.m. UTC
The length of mmap() can be bigger than length of vb2 buffer, so
it should be checked.

Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
---
 drivers/media/v4l2-core/videobuf2-core.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

Comments

Marek Szyprowski April 12, 2013, 6:03 a.m. UTC | #1
On 4/12/2013 5:57 AM, Seung-Woo Kim wrote:
> The length of mmap() can be bigger than length of vb2 buffer, so
> it should be checked.
>
> Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>

Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>

> ---
>   drivers/media/v4l2-core/videobuf2-core.c |    5 +++++
>   1 files changed, 5 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c
> index db1235d..2c6ff2d 100644
> --- a/drivers/media/v4l2-core/videobuf2-core.c
> +++ b/drivers/media/v4l2-core/videobuf2-core.c
> @@ -1886,6 +1886,11 @@ int vb2_mmap(struct vb2_queue *q, struct vm_area_struct *vma)
>   
>   	vb = q->bufs[buffer];
>   
> +	if (vb->v4l2_planes[plane].length < (vma->vm_end - vma->vm_start)) {
> +		dprintk(1, "Invalid length\n");
> +		return -EINVAL;
> +	}
> +
>   	ret = call_memop(q, mmap, vb->planes[plane].mem_priv, vma);
>   	if (ret)
>   		return ret;

Best regards
Laurent Pinchart April 16, 2013, 10:21 a.m. UTC | #2
On Friday 12 April 2013 08:03:15 Marek Szyprowski wrote:
> On 4/12/2013 5:57 AM, Seung-Woo Kim wrote:
> > The length of mmap() can be bigger than length of vb2 buffer, so
> > it should be checked.
> > 
> > Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
> 
> Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>

This should be pushed to the stable kernels, as it's a potential security 
issue.

> > ---
> > 
> >   drivers/media/v4l2-core/videobuf2-core.c |    5 +++++
> >   1 files changed, 5 insertions(+), 0 deletions(-)
> > 
> > diff --git a/drivers/media/v4l2-core/videobuf2-core.c
> > b/drivers/media/v4l2-core/videobuf2-core.c index db1235d..2c6ff2d 100644
> > --- a/drivers/media/v4l2-core/videobuf2-core.c
> > +++ b/drivers/media/v4l2-core/videobuf2-core.c
> > @@ -1886,6 +1886,11 @@ int vb2_mmap(struct vb2_queue *q, struct
> > vm_area_struct *vma)> 
> >   	vb = q->bufs[buffer];
> > 
> > +	if (vb->v4l2_planes[plane].length < (vma->vm_end - vma->vm_start)) {
> > +		dprintk(1, "Invalid length\n");
> > +		return -EINVAL;
> > +	}
> > +
> > 
> >   	ret = call_memop(q, mmap, vb->planes[plane].mem_priv, vma);
> >   	if (ret)
> >   	
> >   		return ret;
Seung-Woo Kim April 18, 2013, 2:53 a.m. UTC | #3
Oops, there is a issue.

vb2-core does not PAGE_ALIGN to length of buffer, but mmap() always do
PAGE_ALIGN to its length.

So non PAGE_ALIGN length of buffer from driver side can not mmaped with
this patch.

On 2013? 04? 12? 15:03, Marek Szyprowski wrote:
> 
> On 4/12/2013 5:57 AM, Seung-Woo Kim wrote:
>> The length of mmap() can be bigger than length of vb2 buffer, so
>> it should be checked.
>>
>> Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
> 
> Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>
> 
>> ---
>>   drivers/media/v4l2-core/videobuf2-core.c |    5 +++++
>>   1 files changed, 5 insertions(+), 0 deletions(-)
>>
>> diff --git a/drivers/media/v4l2-core/videobuf2-core.c
>> b/drivers/media/v4l2-core/videobuf2-core.c
>> index db1235d..2c6ff2d 100644
>> --- a/drivers/media/v4l2-core/videobuf2-core.c
>> +++ b/drivers/media/v4l2-core/videobuf2-core.c
>> @@ -1886,6 +1886,11 @@ int vb2_mmap(struct vb2_queue *q, struct
>> vm_area_struct *vma)
>>         vb = q->bufs[buffer];
>>   +    if (vb->v4l2_planes[plane].length < (vma->vm_end -
>> vma->vm_start)) {
>> +        dprintk(1, "Invalid length\n");
>> +        return -EINVAL;
>> +    }
>> +
>>       ret = call_memop(q, mmap, vb->planes[plane].mem_priv, vma);
>>       if (ret)
>>           return ret;
> 
> Best regards
diff mbox

Patch

diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c
index db1235d..2c6ff2d 100644
--- a/drivers/media/v4l2-core/videobuf2-core.c
+++ b/drivers/media/v4l2-core/videobuf2-core.c
@@ -1886,6 +1886,11 @@  int vb2_mmap(struct vb2_queue *q, struct vm_area_struct *vma)
 
 	vb = q->bufs[buffer];
 
+	if (vb->v4l2_planes[plane].length < (vma->vm_end - vma->vm_start)) {
+		dprintk(1, "Invalid length\n");
+		return -EINVAL;
+	}
+
 	ret = call_memop(q, mmap, vb->planes[plane].mem_priv, vma);
 	if (ret)
 		return ret;