From a383cb401077f9d0f468cd73f69b6571f054dd45 Mon Sep 17 00:00:00 2001 From: Keyon Jie Date: Wed, 25 Aug 2021 10:54:35 +0800 Subject: [PATCH] dma-trace: add check to avoid dereference from NULL The DMA trace is not necessary enabled so the trace_data could be NULL, add check to avoid dereference from NULL pointer and panics. Signed-off-by: Keyon Jie --- src/ipc/dma-copy.c | 8 ++++++++ src/platform/intel/cavs/platform.c | 4 +++- src/trace/dma-trace.c | 6 ++---- src/trace/trace.c | 3 +-- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/ipc/dma-copy.c b/src/ipc/dma-copy.c index ac2ecc345f48..fd2730f732a1 100644 --- a/src/ipc/dma-copy.c +++ b/src/ipc/dma-copy.c @@ -64,6 +64,10 @@ int dma_copy_to_host_nowait(struct dma_copy *dc, struct dma_sg_config *host_sg, { int ret; + /* return if DMA channel is not get yet */ + if (!dc->chan) + return -EINVAL; + /* tell gateway to copy */ ret = dma_copy(dc->chan, size, 0); if (ret < 0) @@ -85,6 +89,10 @@ int dma_copy_to_host_nowait(struct dma_copy *dc, struct dma_sg_config *host_sg, int32_t err; int32_t offset = host_offset; + /* return if DMA channel is not get yet */ + if (!dc->chan) + return -EINVAL; + if (size <= 0) return 0; diff --git a/src/platform/intel/cavs/platform.c b/src/platform/intel/cavs/platform.c index 4356a880e150..7fbaff5e18e4 100644 --- a/src/platform/intel/cavs/platform.c +++ b/src/platform/intel/cavs/platform.c @@ -524,7 +524,9 @@ int platform_init(struct sof *sof) #elif CONFIG_TRACE /* Initialize DMA for Trace*/ trace_point(TRACE_BOOT_PLATFORM_DMA_TRACE); - dma_trace_init_complete(sof->dmat); + ret = dma_trace_init_complete(sof->dmat); + if (ret < 0) + return ret; #endif /* show heap status */ diff --git a/src/trace/dma-trace.c b/src/trace/dma-trace.c index 2d8dc4cd8b71..779480e49468 100644 --- a/src/trace/dma-trace.c +++ b/src/trace/dma-trace.c @@ -476,9 +476,8 @@ void dma_trace_on(void) { struct dma_trace_data *trace_data = dma_trace_data_get(); - if (trace_data->enabled) { + if (!trace_data || trace_data->enabled) return; - } trace_data->enabled = 1; schedule_task(&trace_data->dmat_work, DMA_TRACE_PERIOD, @@ -490,9 +489,8 @@ void dma_trace_off(void) { struct dma_trace_data *trace_data = dma_trace_data_get(); - if (!trace_data->enabled) { + if (!trace_data || !trace_data->enabled) return; - } schedule_task_cancel(&trace_data->dmat_work); trace_data->enabled = 0; diff --git a/src/trace/trace.c b/src/trace/trace.c index b1a378a1c045..fb21dc5ce229 100644 --- a/src/trace/trace.c +++ b/src/trace/trace.c @@ -272,9 +272,8 @@ void trace_log_unfiltered(bool send_atomic, const void *log_entry, const struct struct trace *trace = trace_get(); va_list vl; - if (!trace->enable) { + if (!trace || !trace->enable) return; - } va_start(vl, arg_count); vatrace_log(send_atomic, (uint32_t)log_entry, ctx, lvl, id_1, id_2, arg_count, vl);