pstore/ram: Fix bounds checks for mem_size, record_size, console_size and ftrace_size
PATCH 1/1 pstore/ram: Fix bounds checks for mem_size, record_size, console_size and ftrace_size
The bounds check in ramoops_init_prz was incorrect and ramoops_init_przs had no check. Additionally, ramoops_init_przs allows record_size to be 0, but ramoops_pstore_write_buf would always crash in this case.
Signed-off-by Arve Hjønnevåg <[email protected]>
--- fs/pstore/ram.c | 18 ++++++++++++++++-- 1 files changed, 16 insertions(+), 2 deletions(-)
fs/pstore/ram.c +16 -2
@@ -189,7 +189,7 @@ static int notrace ramoops_pstore_write_buf(enum pstore_type_id type, struct pstore_info *psi) {struct ramoops_context *cxt = psi->data; -struct persistent_ram_zone *prz = cxt->przs[cxt->dump_write_cnt]; +struct persistent_ram_zone *prz;size_t hlen;if (type ==PSTORE_TYPE_CONSOLE ) {
@@ -226,6 +226,11 @@ static int notrace ramoops_pstore_write_buf(enum pstore_type_id type,if (part !=1 )return -ENOSPC ; +if (!cxt->przs) +return -ENOSPC ; + + prz = cxt->przs[cxt->dump_write_cnt]; + hlen =ramoops_write_kmsg_hdr (prz);if (size + hlen > prz->buffer_size) size = prz->buffer_size - hlen;
@@ -296,6 +301,11 @@ static int ramoops_init_przs(struct device *dev, struct ramoops_context *cxt,if (!cxt->record_size)return 0 ; +if (*paddr + dump_mem_sz - cxt->phys_addr > cxt->size) { +dev_err (dev,"no room for dumps\n" ); +return -ENOMEM ; + } + cxt->max_dump_cnt = dump_mem_sz / cxt->record_size;if (!cxt->max_dump_cnt)return -ENOMEM ;
@@ -333,8 +343,12 @@ static int ramoops_init_prz(struct device *dev, struct ramoops_context *cxt,if (!sz)return 0 ; -if (*paddr + sz > *paddr + cxt->size) +if (*paddr + sz - cxt->phys_addr > cxt->size) { +dev_err (dev,"no room for mem region (0x%zx@0x%llx) in (0x%lx@0x%llx)\n" , + sz, (unsigned long long )*paddr, + cxt->size, (unsigned long long )cxt->phys_addr);return -ENOMEM ; + } *prz =persistent_ram_new (*paddr, sz, sig, cxt->ecc_size);if (IS_ERR (*prz)) {
Signature · 1 line
1.7.7.3
Anton Vorontsov
AppliedQuoted 6 lines · Arve Hjønnevåg
The bounds check in
ramoops_init_przwas incorrect andramoops_init_przshad no check. Additionally,ramoops_init_przsallowsrecord_sizeto be 0, butramoops_pstore_write_bufwould always crash in this case.Signed-off-by Arve Hjønnevåg <[email protected]>---
Applied, thanks a lot!