ipc: static analysis issues on NULL pointer access
authorSam Nelson <sam.nelson@ti.com>
Mon, 23 Apr 2018 18:04:01 +0000 (14:04 -0400)
committerAngela Stegmaier <angelabaker@ti.com>
Tue, 24 Apr 2018 17:01:18 +0000 (12:01 -0500)
Added null check to avoid direct crash and return error or assert.

Signed-off-by: Sam Nelson <sam.nelson@ti.com>
12 files changed:
packages/ti/deh/Watchdog.c
packages/ti/ipc/tests/test_omx.c
packages/ti/sdo/ipc/GateMP.c
packages/ti/sdo/ipc/Ipc.c
packages/ti/sdo/ipc/ListMP.c
packages/ti/sdo/ipc/MessageQ.c
packages/ti/sdo/ipc/Notify.c
packages/ti/sdo/ipc/heaps/HeapBufMP.c
packages/ti/sdo/ipc/heaps/HeapMemMP.c
packages/ti/sdo/ipc/heaps/HeapMultiBufMP.c
packages/ti/sdo/ipc/transports/TransportShm.c
packages/ti/sdo/ipc/transports/TransportShmCirc.c

index 726b3483d545f560df395ad54835c6ccdd949f13..3509b1a7ee7317912bc00b83111f0c481080141a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2016, Texas Instruments Incorporated
+ * Copyright (c) 2012-2018, Texas Instruments Incorporated
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -133,6 +133,10 @@ static Void initTimer(volatile Watchdog_TimerRegs *timer, Bool boot)
 
     /* Get timer frequency */
     tHandle = Timer_Object_get(NULL, 0);
+
+    /* Check NULL tHandle */
+    Assert_isTrue((tHandle != NULL) , NULL);
+
     Timer_getFreq(tHandle, &tFreq);
 
     timer->tisr = ~0;
@@ -170,6 +174,10 @@ Void Watchdog_init( Void (*timerFxn)(Void) )
     }
     else {
         tHandle = Timer_Object_get(NULL, 0);
+
+        /* Check NULL tHandle */
+        Assert_isTrue((tHandle != NULL) , NULL);
+
         Timer_getFreq(tHandle, &tFreq);  /* get timer frequency */
 
 #if defined(IPU) && defined(OMAP5)
index 68c2925cd0fae6002c1960d1f58adc6bb928c8a1..011ea6449498c818d4895b9cdc2b1efaaf9e6230 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2015, Texas Instruments Incorporated
+ * Copyright (c) 2011-2018, Texas Instruments Incorporated
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -167,7 +167,7 @@ static RPC_OMX_ERRORTYPE RPC_SKEL_GetHandle(Void *srvc, UInt32 size,
      * <hComp]
      */
 
-    strcpy(cComponentName, (char *)data + sizeof(map_info_type));
+    strncpy(cComponentName, sizeof(cComponentName), (char *)data + sizeof(map_info_type));
 
 #if CHATTER
     System_printf("RPC_SKEL_GetHandle: Component Name received: %s\n",
index 41739bba37507bad1c9392870edf018d7773535d..d604524602d06f5e7ced2b1912dec2de94c074c0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2015 Texas Instruments Incorporated - http://www.ti.com
+ * Copyright (c) 2012-2018 Texas Instruments Incorporated - http://www.ti.com
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -289,6 +289,10 @@ Int GateMP_open(String name, GateMP_Handle *handlePtr)
         /* Opening a remote GateMP. Need to do SharedRegion Ptr conversion. */
         sharedShmBase = (SharedRegion_SRPtr)nsValue[0];
         sharedAddr = SharedRegion_getPtr(sharedShmBase);
+        if ( sharedAddr == NULL ) {
+            *handlePtr = NULL;
+            return (GateMP_E_FAIL);
+        }
         status = GateMP_openByAddr(sharedAddr, handlePtr);
     }
     else {
index a424886719996ab56ce6e4504dd0833967552756..e24151e15769d1e28197b3c50b7e3022fbe19cc4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2015 Texas Instruments Incorporated - http://www.ti.com
+ * Copyright (c) 2012-2018 Texas Instruments Incorporated - http://www.ti.com
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -881,6 +881,9 @@ Int Ipc_writeConfig(UInt16 remoteProcId, UInt32 tag, Ptr cfg, SizeT size)
             entry = (ti_sdo_ipc_Ipc_ConfigEntry *)
                     (SharedRegion_getPtr(curSRPtr));
 
+            /* Assert that the remoteProc in our cluster */
+            Assert_isTrue(entry != NULL, ti_sdo_ipc_Ipc_A_internal);
+
             /* make sure entry matches remoteProcId, tag, and size */
             if ((entry->remoteProcId == remoteProcId) &&
                 (entry->tag == tag) &&
index 6b797e471e652af45594f80dc8699855faf38c95..659757b52bfe28aa1deb279f561480f813e24857 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2015 Texas Instruments Incorporated - http://www.ti.com
+ * Copyright (c) 2012-2018 Texas Instruments Incorporated - http://www.ti.com
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -181,6 +181,10 @@ Int ListMP_open(String name, ListMP_Handle *handlePtr)
     }
 
     sharedAddr = SharedRegion_getPtr(sharedShmBase);
+    if ( sharedAddr == NULL ) {
+        *handlePtr = NULL;
+        return (ListMP_E_NOTFOUND);
+    }
 
     status = ListMP_openByAddr(sharedAddr, handlePtr);
 
@@ -856,15 +860,18 @@ Int ti_sdo_ipc_ListMP_Instance_init(ti_sdo_ipc_ListMP_Object *obj,
         obj->cacheLineSize = SharedRegion_getCacheLineSize(obj->regionId);
 
 #ifdef xdc_target__isaCompatible_v7A
-    /* ARM speculative execution might have pulled attrs into cache */
-    if (obj->cacheEnabled) {
-        Cache_inv(obj->attrs, sizeof(ti_sdo_ipc_ListMP_Attrs), Cache_Type_ALL,
+        /* ARM speculative execution might have pulled attrs into cache */
+        if (obj->cacheEnabled) {
+            Cache_inv(obj->attrs, sizeof(ti_sdo_ipc_ListMP_Attrs), Cache_Type_ALL,
                 TRUE);
-    }
+        }
 #endif
         /* get the local address of the SRPtr */
         localAddr = SharedRegion_getPtr(obj->attrs->gateMPAddr);
 
+        /* Do NULL check on localAddr */
+        Assert_isTrue(localAddr != NULL, ti_sdo_ipc_Ipc_A_internal);
+
         status = GateMP_openByAddr(localAddr, (GateMP_Handle *)&(obj->gate));
         if (status != GateMP_S_SUCCESS) {
             Error_raise(eb, ti_sdo_ipc_Ipc_E_internal, 0, 0);
index ffc13f0aeb819383223bc220d44e569279ee6d79..fdb883bd2abc7d130d717908fc2358e983d3b9a3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2015 Texas Instruments Incorporated - http://www.ti.com
+ * Copyright (c) 2012-2018 Texas Instruments Incorporated - http://www.ti.com
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -486,7 +486,7 @@ Int MessageQ_put(MessageQ_QueueId queueId, MessageQ_Msg msg)
     IMessageQTransport_Handle transport;
     MessageQ_QueueIndex dstProcId = (MessageQ_QueueIndex)(queueId >> 16);
     List_Handle       listHandle;
-    Int               status;
+    Int               status = MessageQ_E_FAIL;
     UInt              priority;
 #ifndef xdc_runtime_Log_DISABLE_ALL
     UInt16            flags;
@@ -640,7 +640,10 @@ Int MessageQ_put(MessageQ_QueueId queueId, MessageQ_Msg msg)
 
             case ti_sdo_ipc_MessageQ_TransportType_INetworkTransport:
                 netTrans = INetworkTransport_Handle_downCast(baseTrans);
-
+                if(netTrans == NULL) {
+                    status = MessageQ_E_FAIL;
+                    break;
+                }
                 if (INetworkTransport_put(netTrans, msg)) {
                     status = MessageQ_S_SUCCESS;
                 }
@@ -978,7 +981,7 @@ Int ti_sdo_ipc_MessageQ_Instance_init(ti_sdo_ipc_MessageQ_Object *obj,
     MessageQ_QueueIndex queueIndex;
     MessageQ_QueueIndex queuePort;
     Int tid;
-    Int status;
+    Int status = MessageQ_E_FAIL;
     ITransport_Handle baseTrans;
     INetworkTransport_Handle netTrans;
 
@@ -1097,6 +1100,10 @@ Int ti_sdo_ipc_MessageQ_Instance_init(ti_sdo_ipc_MessageQ_Object *obj,
 
             case ti_sdo_ipc_MessageQ_TransportType_INetworkTransport:
                 netTrans = INetworkTransport_Handle_downCast(baseTrans);
+                if(netTrans == NULL) {
+                    status = MessageQ_E_FAIL;
+                    break;
+                }
 
                 if (INetworkTransport_bind(netTrans, obj->queue)) {
                     status = MessageQ_S_SUCCESS;
@@ -1109,7 +1116,7 @@ Int ti_sdo_ipc_MessageQ_Instance_init(ti_sdo_ipc_MessageQ_Object *obj,
 
         /* check for failure */
         if (status < 0) {
-            /* TODO add error handling */
+            return(6);
         }
     }
 
@@ -1145,6 +1152,10 @@ Void ti_sdo_ipc_MessageQ_Instance_finalize(
 
             case ti_sdo_ipc_MessageQ_TransportType_INetworkTransport:
                 netTrans = INetworkTransport_Handle_downCast(baseTrans);
+                if(netTrans == NULL) {
+                    status = MessageQ_E_FAIL;
+                    break;
+                }
 
                 if (INetworkTransport_unbind(netTrans, obj->queue)) {
                     status = MessageQ_S_SUCCESS;
index 8163a452f7fac9de2066242921d783c6eb8e2181..accff96358ed28ad6f0d7bd6985fb168be1d9ee5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2014, Texas Instruments Incorporated
+ * Copyright (c) 2012-2018, Texas Instruments Incorporated
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -355,6 +355,11 @@ Int Notify_registerEvent(UInt16                 procId,
     listener->callback.cbckArg = cbckArg;
 
     eventList = List_Object_get(obj->eventList, strippedEventId);
+    if (eventList == NULL) {
+        Gate_leaveModule(modKey);
+
+        return (Notify_E_RESOURCE);
+    }
 
     /*
      *  Store whether the list was empty so we know whether to register the
@@ -645,6 +650,10 @@ Int Notify_unregisterEvent(UInt16                 procId,
 
     eventList = List_Object_get(obj->eventList, strippedEventId);
 
+    if ( eventList == NULL) {
+        return (Notify_E_NOTFOUND);
+    }
+
     if (List_empty(eventList)) {
         return (Notify_E_NOTFOUND);
     }
@@ -903,6 +912,9 @@ Void ti_sdo_ipc_Notify_execMany(UInt16 procId, UInt16 lineId, UInt32 eventId,
     /* Both loopback and the the event itself are enabled */
     eventList = List_Object_get(obj->eventList, eventId);
 
+    /* Check eventList Non Null */
+    Assert_isTrue(eventList != NULL, ti_sdo_ipc_Notify_A_internal);
+
     /* Use "NULL" to get the first EventListener on the list */
     listener = (ti_sdo_ipc_Notify_EventListener *)List_next(eventList, NULL);
     while (listener != NULL) {
index 95af057cf070a037fd2d2efe7836b813b1d8fee1..9281135d5d3d11b842ac88d81a373cf54731366c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2014 Texas Instruments Incorporated - http://www.ti.com
+ * Copyright (c) 2012-2018 Texas Instruments Incorporated - http://www.ti.com
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -270,6 +270,9 @@ Int HeapBufMP_open(String name,
     }
 
     sharedAddr = SharedRegion_getPtr(sharedShmBase);
+    /* Assert if sharedAddr is NULL */
+    Assert_isTrue(sharedAddr != NULL,
+            ti_sdo_ipc_Ipc_A_internal);
 
     status = HeapBufMP_openByAddr(sharedAddr, handlePtr);
 
@@ -428,6 +431,9 @@ Int ti_sdo_ipc_heaps_HeapBufMP_Instance_init(
         obj->objType        = ti_sdo_ipc_Ipc_ObjType_OPENDYNAMIC;
 
         localAddr = SharedRegion_getPtr(obj->attrs->gateMPAddr);
+
+        Assert_isTrue(localAddr != NULL, ti_sdo_ipc_Ipc_A_internal);
+
         status = GateMP_openByAddr(localAddr, (GateMP_Handle *)&(obj->gate));
         if (status != GateMP_S_SUCCESS) {
             Error_raise(eb, ti_sdo_ipc_Ipc_E_internal, 0, 0);
index 1da1518c4bca28fa8069e18d2c85cf098422747b..abb6f36849eea307c50755a951b3703551547d10 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2014 Texas Instruments Incorporated - http://www.ti.com
+ * Copyright (c) 2012-2018 Texas Instruments Incorporated - http://www.ti.com
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -231,6 +231,9 @@ Int HeapMemMP_open(String name, HeapMemMP_Handle *handlePtr)
     }
 
     sharedAddr = SharedRegion_getPtr(sharedShmBase);
+    /* Assert if sharedAddr is NULL */
+    Assert_isTrue(sharedAddr != NULL,
+            ti_sdo_ipc_Ipc_A_internal);
 
     status = HeapMemMP_openByAddr(sharedAddr, handlePtr);
 
@@ -398,6 +401,10 @@ Int ti_sdo_ipc_heaps_HeapMemMP_Instance_init(
         }
 
         localAddr = SharedRegion_getPtr(obj->attrs->gateMPAddr);
+        if (localAddr == NULL) {
+            Error_raise(eb, ti_sdo_ipc_Ipc_E_internal, 0, 0);
+            return(1);
+        }
 
         status = GateMP_openByAddr(localAddr, (GateMP_Handle *)&(obj->gate));
         if (status != GateMP_S_SUCCESS) {
index ad018464e1b74a3ed6289d61738988dec55e3e90..89ff26c391a9f63f53d1455cde0aeee2986c7493 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2014 Texas Instruments Incorporated - http://www.ti.com
+ * Copyright (c) 2012-2018 Texas Instruments Incorporated - http://www.ti.com
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -308,6 +308,8 @@ Int HeapMultiBufMP_open(String name,
     }
 
     sharedAddr = SharedRegion_getPtr(sharedShmBase);
+    Assert_isTrue(sharedAddr != NULL, ti_sdo_ipc_Ipc_A_internal);
+
 
     status = HeapMultiBufMP_openByAddr(sharedAddr, handlePtr);
 
@@ -456,6 +458,7 @@ Int ti_sdo_ipc_heaps_HeapMultiBufMP_Instance_init(
         obj->cacheEnabled   = SharedRegion_isCacheEnabled(obj->regionId);
 
         localAddr = SharedRegion_getPtr(obj->attrs->gateMPAddr);
+        Assert_isTrue(localAddr != NULL, ti_sdo_ipc_Ipc_A_internal);
 
         status = GateMP_openByAddr(localAddr, (GateMP_Handle *)&(obj->gate));
         if (status != GateMP_S_SUCCESS) {
@@ -513,6 +516,8 @@ Int ti_sdo_ipc_heaps_HeapMultiBufMP_Instance_init(
 
     HeapMultiBufMP_postInit(obj, eb);
     if (Error_check(eb)) {
+        /* Set to NULL since optBucketEntries is on the stack */
+        obj->bucketEntries = NULL;
         return (1);
     }
 
@@ -766,6 +771,10 @@ ti_sdo_ipc_heaps_HeapMultiBufMP_Elem *ti_sdo_ipc_heaps_HeapMultiBufMP_getHead(
         sharedBlock = obj->attrs->buckets[index].head;
         block = SharedRegion_getPtr(sharedBlock);
 
+        if (block == NULL) {
+            return(NULL);
+        }
+
         if (obj->cacheEnabled) {
             /*
              *  Only need to invalidate the elem, not the entire block.
index b3475f915a0233246f95bbdcd3d0790e75845384..2bcb7446a9bbf67d098f1d22ce0f4dacaa0775e6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2015 Texas Instruments Incorporated - http://www.ti.com
+ * Copyright (c) 2012-2018 Texas Instruments Incorporated - http://www.ti.com
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -155,6 +155,8 @@ Int TransportShm_Instance_init(TransportShm_Object *obj,
         obj->cacheEnabled = SharedRegion_isCacheEnabled(obj->regionId);
 
         localAddr = SharedRegion_getPtr(obj->self->gateMPAddr);
+        Assert_isTrue(localAddr != NULL, ti_sdo_ipc_Ipc_A_internal);
+
         status = GateMP_openByAddr(localAddr, (GateMP_Handle *)&obj->gate);
         if (status < 0) {
             Error_raise(eb, ti_sdo_ipc_Ipc_E_internal, 0, 0);
index 0058666d9db5cbab1dc01d7f77d5778571c77422..2c5f0724c0b9a4c08d083d42e296a3f83cdd6c21 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2013, Texas Instruments Incorporated
+ * Copyright (c) 2012-2018, Texas Instruments Incorporated
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -436,6 +436,9 @@ Void TransportShmCirc_swiFxn(UArg arg)
         /* get the msg (convert SRPtr to Ptr) */
         msg = SharedRegion_getPtr((SharedRegion_SRPtr)eventEntry[0]);
 
+        /* Make sure the msg Ptr is not NULL */
+        Assert_isTrue(msg != NULL, ti_sdo_ipc_Ipc_A_internal);
+
         /* get the queue id */
         queueId = MessageQ_getDstQueue(msg);