SDOCM00114745 Ipc_transportConfig has race window
authorRamsey Harris <ramsey@ti.com>
Fri, 13 Mar 2015 00:29:52 +0000 (17:29 -0700)
committerRobert Tivy <rtivy@ti.com>
Fri, 13 Mar 2015 23:33:09 +0000 (16:33 -0700)
Regardless of the Ipc module reference count, any subsequent
caller to Ipc_transportConfig must use the same factory as
the first caller. Otherwise, it is an error.

linux/src/api/Ipc.c

index 9dfb176879a3c344c92e152ac189af726b1f00ed..b6290941f5180e9f9df0a50f56307bbd5496f4ea 100644 (file)
@@ -314,20 +314,22 @@ exit:
  */
 Int Ipc_transportConfig(Ipc_TransportFactoryFxns *factory)
 {
-    Int status;
+    Int status = Ipc_S_SUCCESS;
 
     pthread_mutex_lock(&Ipc_module.gate);
-    status = Ipc_S_SUCCESS;
 
-    /* transport configuration must happen before start phase */
-    if (Ipc_module.refCount != 0) {
-        status = Ipc_E_INVALIDSTATE;
+    /*  Only the first caller can actually set the transport factory.
+     *  Subsequent callers (e.g. multi-threaded application) must be
+     *  using the same factory. Otherwise, it is an error.
+     */
+    if (Ipc_module.transportFactory == NULL) {
+        Ipc_module.transportFactory = factory;
+    }
+    else if (Ipc_module.transportFactory != factory) {
+        status = Ipc_E_INVALIDARG;
         goto exit;
     }
 
-    /* store factory address in module state */
-    Ipc_module.transportFactory = factory;
-
 exit:
     pthread_mutex_unlock(&Ipc_module.gate);