From bb753d806e9e333c6a5ec5273b8728f24f3b5eae Mon Sep 17 00:00:00 2001 From: Ivan Priest Date: Tue, 14 May 2019 12:56:50 +0100 Subject: [PATCH] [NEUS7920-477] wlbt: check mxlogger is configured before generating sync record The mxlogger sync record could be requested when driver is tearing down, causing a kernel panic. Check the flag and reject memory access if the logger is deconfigured. Change-Id: If90d44d42eeb8a3d33fb36ae3aa8d756923cea48 SCSC-Bug-Id: SSB-52717 Signed-off-by: Ivan Priest (cherry picked from commit 75d01666aee1e3ec27ee84bc1943f4bed31fe51b) --- drivers/misc/samsung/scsc/mxlogger.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/drivers/misc/samsung/scsc/mxlogger.c b/drivers/misc/samsung/scsc/mxlogger.c index 8d37d634eaf1..80c1d030ad27 100644 --- a/drivers/misc/samsung/scsc/mxlogger.c +++ b/drivers/misc/samsung/scsc/mxlogger.c @@ -243,6 +243,10 @@ static int __mxlogger_generate_sync_record(struct mxlogger *mxlogger, enum mxlog void *mem; ktime_t t1, t2; + /* Assume mxlogger->lock mutex is held */ + if (!mxlogger || !mxlogger->configured) + return -EIO; + msg.msg = MM_MXLOGGER_SYNC_RECORD; msg.arg = MM_MXLOGGER_SYNC_INDEX; memcpy(&msg.payload, &mxlogger->sync_buffer_index, sizeof(mxlogger->sync_buffer_index)); @@ -398,12 +402,15 @@ static int mxlogger_send_config(struct mxlogger *mxlogger) static void mxlogger_to_shared_dram(struct mxlogger *mxlogger) { + int r; struct log_msg_packet msg = { .msg = MM_MXLOGGER_DIRECTION_CMD, .arg = MM_MXLOGGER_DIRECTION_DRAM }; SCSC_TAG_INFO(MXMAN, "MXLOGGER -- NO active observers detected. Send logs to DRAM\n"); - __mxlogger_generate_sync_record(mxlogger, MXLOGGER_SYN_TORAM); + r = __mxlogger_generate_sync_record(mxlogger, MXLOGGER_SYN_TORAM); + if (r) + return; /* mxlogger is not configured */ mxmgmt_transport_send(scsc_mx_get_mxmgmt_transport(mxlogger->mx), MMTRANS_CHAN_ID_MAXWELL_LOGGING, @@ -412,12 +419,15 @@ static void mxlogger_to_shared_dram(struct mxlogger *mxlogger) static void mxlogger_to_host(struct mxlogger *mxlogger) { + int r; struct log_msg_packet msg = { .msg = MM_MXLOGGER_DIRECTION_CMD, .arg = MM_MXLOGGER_DIRECTION_HOST }; SCSC_TAG_INFO(MXMAN, "MXLOGGER -- active observers detected. Send logs to host\n"); - __mxlogger_generate_sync_record(mxlogger, MXLOGGER_SYN_TOHOST); + r = __mxlogger_generate_sync_record(mxlogger, MXLOGGER_SYN_TOHOST); + if (r) + return; /* mxlogger is not configured */ mxmgmt_transport_send(scsc_mx_get_mxmgmt_transport(mxlogger->mx), MMTRANS_CHAN_ID_MAXWELL_LOGGING, @@ -805,9 +815,11 @@ void mxlogger_deinit(struct scsc_mx *mx, struct mxlogger *mxlogger) scsc_log_collector_unregister_client(&mxlogger_collect_client_udi); #endif mutex_lock(&mxlogger->lock); + + mxlogger_to_host(mxlogger); /* immediately before deconfigure to get a last sync rec */ mxlogger->configured = false; mxlogger->initialized = false; - mxlogger_to_host(mxlogger); + #ifdef CONFIG_SCSC_LOG_COLLECTION scsc_log_collector_is_observer(true); #endif -- 2.20.1