|
@@ -295,12 +295,20 @@ static void *qp_alloc_queue(u64 size, u32 flags)
|
|
{
|
|
{
|
|
u64 i;
|
|
u64 i;
|
|
struct vmci_queue *queue;
|
|
struct vmci_queue *queue;
|
|
- const size_t num_pages = DIV_ROUND_UP(size, PAGE_SIZE) + 1;
|
|
|
|
- const size_t pas_size = num_pages * sizeof(*queue->kernel_if->u.g.pas);
|
|
|
|
- const size_t vas_size = num_pages * sizeof(*queue->kernel_if->u.g.vas);
|
|
|
|
- const size_t queue_size =
|
|
|
|
- sizeof(*queue) + sizeof(*queue->kernel_if) +
|
|
|
|
- pas_size + vas_size;
|
|
|
|
|
|
+ size_t pas_size;
|
|
|
|
+ size_t vas_size;
|
|
|
|
+ size_t queue_size = sizeof(*queue) + sizeof(*queue->kernel_if);
|
|
|
|
+ const u64 num_pages = DIV_ROUND_UP(size, PAGE_SIZE) + 1;
|
|
|
|
+
|
|
|
|
+ if (num_pages >
|
|
|
|
+ (SIZE_MAX - queue_size) /
|
|
|
|
+ (sizeof(*queue->kernel_if->u.g.pas) +
|
|
|
|
+ sizeof(*queue->kernel_if->u.g.vas)))
|
|
|
|
+ return NULL;
|
|
|
|
+
|
|
|
|
+ pas_size = num_pages * sizeof(*queue->kernel_if->u.g.pas);
|
|
|
|
+ vas_size = num_pages * sizeof(*queue->kernel_if->u.g.vas);
|
|
|
|
+ queue_size += pas_size + vas_size;
|
|
|
|
|
|
queue = vmalloc(queue_size);
|
|
queue = vmalloc(queue_size);
|
|
if (!queue)
|
|
if (!queue)
|
|
@@ -615,10 +623,15 @@ static int qp_memcpy_from_queue_iov(void *dest,
|
|
static struct vmci_queue *qp_host_alloc_queue(u64 size)
|
|
static struct vmci_queue *qp_host_alloc_queue(u64 size)
|
|
{
|
|
{
|
|
struct vmci_queue *queue;
|
|
struct vmci_queue *queue;
|
|
- const size_t num_pages = DIV_ROUND_UP(size, PAGE_SIZE) + 1;
|
|
|
|
|
|
+ size_t queue_page_size;
|
|
|
|
+ const u64 num_pages = DIV_ROUND_UP(size, PAGE_SIZE) + 1;
|
|
const size_t queue_size = sizeof(*queue) + sizeof(*(queue->kernel_if));
|
|
const size_t queue_size = sizeof(*queue) + sizeof(*(queue->kernel_if));
|
|
- const size_t queue_page_size =
|
|
|
|
- num_pages * sizeof(*queue->kernel_if->u.h.page);
|
|
|
|
|
|
+
|
|
|
|
+ if (num_pages > (SIZE_MAX - queue_size) /
|
|
|
|
+ sizeof(*queue->kernel_if->u.h.page))
|
|
|
|
+ return NULL;
|
|
|
|
+
|
|
|
|
+ queue_page_size = num_pages * sizeof(*queue->kernel_if->u.h.page);
|
|
|
|
|
|
queue = kzalloc(queue_size + queue_page_size, GFP_KERNEL);
|
|
queue = kzalloc(queue_size + queue_page_size, GFP_KERNEL);
|
|
if (queue) {
|
|
if (queue) {
|