|
|
@@ -410,9 +410,18 @@ create_pagelist(char __user *buf, size_t count, unsigned short type)
|
|
|
int dma_buffers;
|
|
|
dma_addr_t dma_addr;
|
|
|
|
|
|
+ if (count >= INT_MAX - PAGE_SIZE)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
offset = ((unsigned int)(unsigned long)buf & (PAGE_SIZE - 1));
|
|
|
num_pages = DIV_ROUND_UP(count + offset, PAGE_SIZE);
|
|
|
|
|
|
+ if (num_pages > (SIZE_MAX - sizeof(PAGELIST_T) -
|
|
|
+ sizeof(struct vchiq_pagelist_info)) /
|
|
|
+ (sizeof(u32) + sizeof(pages[0]) +
|
|
|
+ sizeof(struct scatterlist)))
|
|
|
+ return NULL;
|
|
|
+
|
|
|
pagelist_size = sizeof(PAGELIST_T) +
|
|
|
(num_pages * sizeof(u32)) +
|
|
|
(num_pages * sizeof(pages[0]) +
|