|
@@ -159,10 +159,15 @@ static int udl_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
|
|
{
|
|
{
|
|
unsigned long start = vma->vm_start;
|
|
unsigned long start = vma->vm_start;
|
|
unsigned long size = vma->vm_end - vma->vm_start;
|
|
unsigned long size = vma->vm_end - vma->vm_start;
|
|
- unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
|
|
|
|
|
|
+ unsigned long offset;
|
|
unsigned long page, pos;
|
|
unsigned long page, pos;
|
|
|
|
|
|
- if (offset + size > info->fix.smem_len)
|
|
|
|
|
|
+ if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ offset = vma->vm_pgoff << PAGE_SHIFT;
|
|
|
|
+
|
|
|
|
+ if (offset > info->fix.smem_len || size > info->fix.smem_len - offset)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
pos = (unsigned long)info->fix.smem_start + offset;
|
|
pos = (unsigned long)info->fix.smem_start + offset;
|