From f2049e662669ea431bf9271ae17e256218615377 Mon Sep 17 00:00:00 2001 From: Komal Bajaj Date: Thu, 22 Apr 2021 14:09:50 +0530 Subject: [PATCH] soc: qcom: Add check to handle out of bound access Adding check in msm_minidump_add_region() to handle scenarios for out of bound access while adding region in minidump table in SMEM. Change-Id: Ic20663dbd2fa8ae96899930a7f7ba79dc204ff5e Signed-off-by: Komal Bajaj --- drivers/soc/qcom/msm_minidump.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/drivers/soc/qcom/msm_minidump.c b/drivers/soc/qcom/msm_minidump.c index ccca4c0d76a2..ac4c3b08e5b5 100644 --- a/drivers/soc/qcom/msm_minidump.c +++ b/drivers/soc/qcom/msm_minidump.c @@ -252,6 +252,7 @@ EXPORT_SYMBOL(msm_minidump_update_region); int msm_minidump_add_region(const struct md_region *entry) { u32 entries; + u32 toc_init; struct md_region *mdr; unsigned long flags; @@ -272,6 +273,18 @@ int msm_minidump_add_region(const struct md_region *entry) return -ENOMEM; } + toc_init = 0; + if (minidump_table.md_ss_toc && + (minidump_table.md_ss_toc->md_ss_enable_status == + MD_SS_ENABLED)) { + toc_init = 1; + if (minidump_table.md_ss_toc->ss_region_count >= MAX_NUM_ENTRIES) { + spin_unlock_irqrestore(&mdt_lock, flags); + pr_err("Maximum regions in minidump table reached.\n"); + return -ENOMEM; + } + } + mdr = &minidump_table.entry[entries]; strlcpy(mdr->name, entry->name, sizeof(mdr->name)); mdr->virt_addr = entry->virt_addr; @@ -281,9 +294,7 @@ int msm_minidump_add_region(const struct md_region *entry) minidump_table.num_regions = entries + 1; - if (minidump_table.md_ss_toc && - (minidump_table.md_ss_toc->md_ss_enable_status == - MD_SS_ENABLED)) + if (toc_init) md_update_ss_toc(entry); else pendings++;