Skip to content

Commit

Permalink
fbdev: improve fb_mmap bounds checks
Browse files Browse the repository at this point in the history
Improve fb_mmap bounds checks in gbefb, smscufx, udlfb and vfb drivers to
prevent possible uint overflows.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: Steve Glendinning <steve.glendinning@smsc.com>
Cc: Bernie Thompson <bernie@plugable.com>
  • Loading branch information
Tomi Valkeinen committed Apr 26, 2013
1 parent 11bd593 commit 04f8afb
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 5 deletions.
4 changes: 3 additions & 1 deletion drivers/video/gbefb.c
Original file line number Diff line number Diff line change
Expand Up @@ -1016,7 +1016,9 @@ static int gbefb_mmap(struct fb_info *info,
/* check range */
if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
return -EINVAL;
if (offset + size > gbe_mem_size)
if (size > gbe_mem_size)
return -EINVAL;
if (offset > gbe_mem_size - size)
return -EINVAL;

/* remap using the fastest write-through mode on architecture */
Expand Down
6 changes: 5 additions & 1 deletion drivers/video/smscufx.c
Original file line number Diff line number Diff line change
Expand Up @@ -782,7 +782,11 @@ static int ufx_ops_mmap(struct fb_info *info, struct vm_area_struct *vma)
unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
unsigned long page, pos;

if (offset + size > info->fix.smem_len)
if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
return -EINVAL;
if (size > info->fix.smem_len)
return -EINVAL;
if (offset > info->fix.smem_len - size)
return -EINVAL;

pos = (unsigned long)info->fix.smem_start + offset;
Expand Down
6 changes: 5 additions & 1 deletion drivers/video/udlfb.c
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,11 @@ static int dlfb_ops_mmap(struct fb_info *info, struct vm_area_struct *vma)
unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
unsigned long page, pos;

if (offset + size > info->fix.smem_len)
if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
return -EINVAL;
if (size > info->fix.smem_len)
return -EINVAL;
if (offset > info->fix.smem_len - size)
return -EINVAL;

pos = (unsigned long)info->fix.smem_start + offset;
Expand Down
7 changes: 5 additions & 2 deletions drivers/video/vfb.c
Original file line number Diff line number Diff line change
Expand Up @@ -420,9 +420,12 @@ static int vfb_mmap(struct fb_info *info,
unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
unsigned long page, pos;

if (offset + size > info->fix.smem_len) {
if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
return -EINVAL;
if (size > info->fix.smem_len)
return -EINVAL;
if (offset > info->fix.smem_len - size)
return -EINVAL;
}

pos = (unsigned long)info->fix.smem_start + offset;

Expand Down

0 comments on commit 04f8afb

Please sign in to comment.