diff options
Diffstat (limited to 'drivers/of/kexec.c')
-rw-r--r-- | drivers/of/kexec.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/of/kexec.c b/drivers/of/kexec.c index f2e58ddfaed2..e6c01db393f9 100644 --- a/drivers/of/kexec.c +++ b/drivers/of/kexec.c @@ -128,6 +128,7 @@ int __init ima_get_kexec_buffer(void **addr, size_t *size) { int ret, len; unsigned long tmp_addr; + unsigned long start_pfn, end_pfn; size_t tmp_size; const void *prop; @@ -139,6 +140,22 @@ int __init ima_get_kexec_buffer(void **addr, size_t *size) if (ret) return ret; + /* Do some sanity on the returned size for the ima-kexec buffer */ + if (!tmp_size) + return -ENOENT; + + /* + * Calculate the PFNs for the buffer and ensure + * they are with in addressable memory. + */ + start_pfn = PHYS_PFN(tmp_addr); + end_pfn = PHYS_PFN(tmp_addr + tmp_size - 1); + if (!page_is_ram(start_pfn) || !page_is_ram(end_pfn)) { + pr_warn("IMA buffer at 0x%lx, size = 0x%zx beyond memory\n", + tmp_addr, tmp_size); + return -EINVAL; + } + *addr = __va(tmp_addr); *size = tmp_size; |