struct cell *cell;
int err;
+ if (cell_desc->num_memory_regions >=
+ ULONG_MAX / sizeof(struct jailhouse_memory))
+ return ERR_PTR(-EINVAL);
+
cell = kzalloc(sizeof(*cell), GFP_KERNEL);
if (!cell)
return ERR_PTR(-ENOMEM);
err = -EINVAL;
if (memcmp(header->signature, JAILHOUSE_SIGNATURE,
- sizeof(header->signature)) != 0)
+ sizeof(header->signature)) != 0 ||
+ hypervisor->size >= hv_mem->size)
goto error_release_fw;
hv_core_and_percpu_size = PAGE_ALIGN(header->core_size) +
max_cpus * header->percpu_size;
config_size = jailhouse_system_config_size(&config_header);
- if (hv_mem->size <= hv_core_and_percpu_size + config_size)
+ if (hv_core_and_percpu_size >= hv_mem->size ||
+ config_size >= hv_mem->size - hv_core_and_percpu_size)
goto error_release_fw;
hypervisor_mem = jailhouse_ioremap(hv_mem->phys_start, JAILHOUSE_BASE,
/* cell is zero-initialized, no need to set pci fields */
return 0;
+ if (cell_desc->num_pci_devices >=
+ ULONG_MAX / sizeof(struct jailhouse_pci_device))
+ return -EINVAL;
+
cell->num_pci_devices = cell_desc->num_pci_devices;
cell->pci_devices = vmalloc(sizeof(struct jailhouse_pci_device) *
cell->num_pci_devices);