From 25dd45f443a9cf2a19f0b1b3952d3717bb3e7bb3 Mon Sep 17 00:00:00 2001 From: Adrian Bonislawski Date: Tue, 9 Apr 2019 14:07:23 +0200 Subject: [PATCH] panic: panicinfo filename OOB fix Signed-off-by: Adrian Bonislawski --- src/include/uapi/ipc/trace.h | 4 +++- src/lib/panic.c | 8 +++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/include/uapi/ipc/trace.h b/src/include/uapi/ipc/trace.h index d52d29156..06c9cef0b 100644 --- a/src/include/uapi/ipc/trace.h +++ b/src/include/uapi/ipc/trace.h @@ -86,7 +86,9 @@ struct sof_ipc_dma_trace_posn { #define SOF_IPC_PANIC_WFI (SOF_IPC_PANIC_MAGIC | 0xa) #define SOF_IPC_PANIC_ASSERT (SOF_IPC_PANIC_MAGIC | 0xb) -/* panic info include filename and line number */ +/* panic info include filename and line number + * filename array will not include null terminator if fully filled + */ struct sof_ipc_panic_info { struct sof_ipc_hdr hdr; uint32_t code; /* SOF_IPC_PANIC_ */ diff --git a/src/lib/panic.c b/src/lib/panic.c index c10005b03..84f3b2a3e 100644 --- a/src/lib/panic.c +++ b/src/lib/panic.c @@ -99,8 +99,14 @@ void __panic(uint32_t p, char *filename, uint32_t linenum) int strlen; strlen = rstrlen(filename); + if (strlen >= SOF_TRACE_FILENAME_SIZE) { + rmemcpy(panicinfo.filename, filename + strlen - + SOF_TRACE_FILENAME_SIZE, SOF_TRACE_FILENAME_SIZE); + rmemcpy(panicinfo.filename, "...", 3); + } else { + rmemcpy(panicinfo.filename, filename, strlen + 1); + } panicinfo.linenum = linenum; - rmemcpy(panicinfo.filename, filename, strlen + 1); panic_rewind(p, 0, &panicinfo); }