SDOCM00114745 Ipc_transportConfig has race window
[ipc/ipcdev.git] / linux / src / api / Ipc.c
index 9dfb176879a3c344c92e152ac189af726b1f00ed..b6290941f5180e9f9df0a50f56307bbd5496f4ea 100644 (file)
@@ -314,20 +314,22 @@ exit:
  */
 Int Ipc_transportConfig(Ipc_TransportFactoryFxns *factory)
 {
  */
 Int Ipc_transportConfig(Ipc_TransportFactoryFxns *factory)
 {
-    Int status;
+    Int status = Ipc_S_SUCCESS;
 
     pthread_mutex_lock(&Ipc_module.gate);
 
     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;
     }
 
         goto exit;
     }
 
-    /* store factory address in module state */
-    Ipc_module.transportFactory = factory;
-
 exit:
     pthread_mutex_unlock(&Ipc_module.gate);
 
 exit:
     pthread_mutex_unlock(&Ipc_module.gate);