From 9021984e1451af71b8bf8dd2dad63805cc7a33a1 Mon Sep 17 00:00:00 2001 From: Yashwanth Date: Thu, 26 Aug 2021 09:22:07 +0530 Subject: [PATCH] disp: msm: sde: add checks to avoid null pointer dereference This change adds required checks to avoid accessing the null pointer in case where memory allocation fails while dumping the registers in memory. Change-Id: Ic087a1bd041d193820289672d325a78795c48c14 Signed-off-by: Yashwanth --- msm/sde_dbg.c | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/msm/sde_dbg.c b/msm/sde_dbg.c index 12ca18734ebc..bffdeb93f4b3 100644 --- a/msm/sde_dbg.c +++ b/msm/sde_dbg.c @@ -504,6 +504,9 @@ static void _sde_dump_reg(const char *dump_name, u32 reg_dump_flag, pr_debug("%s: reg_dump_flag=%d in_log=%d in_mem=%d\n", dump_name, reg_dump_flag, in_log, in_mem); + if (!dbg_base->reg_dump_addr) + in_mem = 0; + if (!in_log && !in_mem) return; @@ -711,12 +714,15 @@ static void _sde_dump_reg_by_ranges(struct sde_dbg_reg_base *dbg, addr, range_node->offset.start, range_node->offset.end); - scnprintf(dbg_base->reg_dump_addr, REG_BASE_NAME_LEN, - dbg->name); - dbg_base->reg_dump_addr += REG_BASE_NAME_LEN; - scnprintf(dbg_base->reg_dump_addr, RANGE_NAME_LEN, - range_node->range_name); - dbg_base->reg_dump_addr += RANGE_NAME_LEN; + if (dbg_base->reg_dump_addr) { + scnprintf(dbg_base->reg_dump_addr, REG_BASE_NAME_LEN, + dbg->name); + dbg_base->reg_dump_addr += REG_BASE_NAME_LEN; + scnprintf(dbg_base->reg_dump_addr, RANGE_NAME_LEN, + range_node->range_name); + dbg_base->reg_dump_addr += RANGE_NAME_LEN; + } + _sde_dump_reg(range_node->range_name, reg_dump_flag, dbg->base, addr, len, &range_node->reg_dump); @@ -729,10 +735,13 @@ static void _sde_dump_reg_by_ranges(struct sde_dbg_reg_base *dbg, dbg->max_offset); addr = dbg->base; len = dbg->max_offset; - scnprintf(dbg_base->reg_dump_addr, REG_BASE_NAME_LEN, - dbg->name); - dbg_base->reg_dump_addr += REG_BASE_NAME_LEN; - dbg_base->reg_dump_addr += RANGE_NAME_LEN; + if (dbg_base->reg_dump_addr) { + scnprintf(dbg_base->reg_dump_addr, REG_BASE_NAME_LEN, + dbg->name); + dbg_base->reg_dump_addr += REG_BASE_NAME_LEN; + dbg_base->reg_dump_addr += RANGE_NAME_LEN; + } + _sde_dump_reg(dbg->name, reg_dump_flag, dbg->base, addr, len, &dbg->reg_dump); } @@ -1352,6 +1361,10 @@ static void _sde_dump_array(struct sde_dbg_reg_base *blk_arr[], dbg_base->reg_dump_addr = devm_kzalloc(sde_dbg_base.dev, reg_dump_size, GFP_KERNEL); + if (!dbg_base->reg_dump_addr) + pr_err("Failed to allocate memory for reg_dump_addr size:%d\n", + reg_dump_size); + if (dbg_base->reg_dump_addr && sde_mini_dump_add_region("reg_dump", reg_dump_size, dbg_base->reg_dump_addr) < 0)