Add FD_CLOEXEC flag for sockets, /dev/mem and LAD pipes
[ipc/ipcdev.git] / linux / src / transport / TransportRpmsg.c
index fcc6fb6b26bb08362f8d048757bc7fc0cc5dde1b..102b3909a65529ae2d4df3cca56a3140b5ef10bc 100644 (file)
@@ -172,6 +172,7 @@ TransportRpmsg_Handle TransportRpmsg_create(TransportRpmsg_Params *params)
     Int status = MessageQ_S_SUCCESS;
     TransportRpmsg_Object *obj = NULL;
     int sock;
+    int flags;
     UInt16 clusterId;
     int i;
 
@@ -199,6 +200,12 @@ TransportRpmsg_Handle TransportRpmsg_create(TransportRpmsg_Params *params)
         goto done;
     }
 
+    /* make sure socket fd doesn't exist for 'fork() -> exec*()'ed child */
+    flags = fcntl(sock, F_GETFD);
+    if (flags != -1) {
+        fcntl(sock, F_SETFD, flags | FD_CLOEXEC);
+    }
+
     /* create the instance object */
     obj = calloc(1, sizeof(TransportRpmsg_Object));
 
@@ -274,6 +281,7 @@ Int TransportRpmsg_bind(Void *handle, UInt32 queueId)
     TransportRpmsg_Object *obj = (TransportRpmsg_Object *)handle;
     UInt16 queuePort = queueId & 0x0000ffff;
     int fd;
+    int flags;
     int err;
     uint64_t event;
     UInt16 rprocId;
@@ -319,6 +327,12 @@ Int TransportRpmsg_bind(Void *handle, UInt32 queueId)
         goto done;
     }
 
+    /* make sure socket fd doesn't exist for 'fork() -> exec*()'ed child */
+    flags = fcntl(fd, F_GETFD);
+    if (flags != -1) {
+        fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
+    }
+
     /*  pause the dispatch thread */
     PRINTVERBOSE1("TransportRpmsg_bind: sending PAUSE event, tid=0x%x\n",
             (unsigned int)tid);
@@ -782,6 +796,7 @@ Int TransportRpmsg_Factory_create(Void)
     Int i;
     UInt16 clusterSize;
     TransportRpmsg_Handle *inst;
+    int flags;
 
 
     /* needed to enumerate processors in cluster */
@@ -827,6 +842,16 @@ Int TransportRpmsg_Factory_create(Void)
     PRINTVERBOSE1("create: created wait event %d\n",
             TransportRpmsg_module->waitEvent)
 
+    /* make sure eventfds don't exist for 'fork() -> exec*()'ed child */
+    flags = fcntl(TransportRpmsg_module->waitEvent, F_GETFD);
+    if (flags != -1) {
+        fcntl(TransportRpmsg_module->waitEvent, F_SETFD, flags | FD_CLOEXEC);
+    }
+    flags = fcntl(TransportRpmsg_module->unblockEvent, F_GETFD);
+    if (flags != -1) {
+        fcntl(TransportRpmsg_module->unblockEvent, F_SETFD, flags | FD_CLOEXEC);
+    }
+
     FD_ZERO(&TransportRpmsg_module->rfds);
     FD_SET(TransportRpmsg_module->unblockEvent,
             &TransportRpmsg_module->rfds);