|
@@ -33,6 +33,7 @@
|
|
#include <linux/seq_file.h>
|
|
#include <linux/seq_file.h>
|
|
#include <linux/poll.h>
|
|
#include <linux/poll.h>
|
|
#include <linux/reservation.h>
|
|
#include <linux/reservation.h>
|
|
|
|
+#include <linux/mm.h>
|
|
|
|
|
|
#include <uapi/linux/dma-buf.h>
|
|
#include <uapi/linux/dma-buf.h>
|
|
|
|
|
|
@@ -90,7 +91,7 @@ static int dma_buf_mmap_internal(struct file *file, struct vm_area_struct *vma)
|
|
dmabuf = file->private_data;
|
|
dmabuf = file->private_data;
|
|
|
|
|
|
/* check for overflowing the buffer's size */
|
|
/* check for overflowing the buffer's size */
|
|
- if (vma->vm_pgoff + ((vma->vm_end - vma->vm_start) >> PAGE_SHIFT) >
|
|
|
|
|
|
+ if (vma->vm_pgoff + vma_pages(vma) >
|
|
dmabuf->size >> PAGE_SHIFT)
|
|
dmabuf->size >> PAGE_SHIFT)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
@@ -723,11 +724,11 @@ int dma_buf_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma,
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
/* check for offset overflow */
|
|
/* check for offset overflow */
|
|
- if (pgoff + ((vma->vm_end - vma->vm_start) >> PAGE_SHIFT) < pgoff)
|
|
|
|
|
|
+ if (pgoff + vma_pages(vma) < pgoff)
|
|
return -EOVERFLOW;
|
|
return -EOVERFLOW;
|
|
|
|
|
|
/* check for overflowing the buffer's size */
|
|
/* check for overflowing the buffer's size */
|
|
- if (pgoff + ((vma->vm_end - vma->vm_start) >> PAGE_SHIFT) >
|
|
|
|
|
|
+ if (pgoff + vma_pages(vma) >
|
|
dmabuf->size >> PAGE_SHIFT)
|
|
dmabuf->size >> PAGE_SHIFT)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|