[NEUS7920-477] wlbt: check mxlogger is configured before generating sync record
authorIvan Priest <i.priest@samsung.com>
Tue, 14 May 2019 11:56:50 +0000 (12:56 +0100)
committerKim Gunho <gunho.kim@samsung.com>
Fri, 28 Jun 2019 14:45:57 +0000 (23:45 +0900)
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 <i.priest@samsung.com>
(cherry picked from commit 75d01666aee1e3ec27ee84bc1943f4bed31fe51b)

drivers/misc/samsung/scsc/mxlogger.c

index 8d37d634eaf1ab414b5cb286d994bc3e6e369e4a..80c1d030ad273a20569e008032ca55490cf34f41 100644 (file)
@@ -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