Add FD_CLOEXEC flag for sockets, /dev/mem and LAD pipes 3.36.02.12_eng 3.40.00.01_eng
authorRobert Tivy <rtivy@ti.com>
Thu, 18 Jun 2015 22:28:56 +0000 (15:28 -0700)
committerRobert Tivy <rtivy@ti.com>
Fri, 19 Jun 2015 20:58:40 +0000 (13:58 -0700)
If a user application calls system() to launch another Ipc application
then that launched application will inherit open file descriptors from
its parent application, which is not desired (except maybe for stdin/
stdout/stderr).  This happens because of the underlying fork() & exec()
calls performed by the system() API.

linux/src/api/gates/GateHWSpinlock.c
linux/src/transport/TransportRpmsg.c
linux/src/utils/LAD_client.c

index 3ec7e136592de064ab7b671fc2c7df107d01e234..b57016a99cfd2aa4ec83f2d220b4248e1885af9d 100644 (file)
@@ -171,6 +171,7 @@ Int32 GateHWSpinlock_start(Void)
     Int32               status = GateHWSpinlock_S_SUCCESS;
     UInt32              dst;
     Int32               fdMem;
+    int                 flags;
 
     fdMem = open ("/dev/mem", O_RDWR | O_SYNC);
 
@@ -179,6 +180,12 @@ Int32 GateHWSpinlock_start(Void)
         status = GateHWSpinlock_E_OSFAILURE;
     }
 
+    /* make sure /dev/mem fd doesn't exist for 'fork() -> exec*()'ed child */
+    flags = fcntl(fdMem, F_GETFD);
+    if (flags != -1) {
+        fcntl(fdMem, F_SETFD, flags | FD_CLOEXEC);
+    }
+
     /* map the hardware lock registers into the local address space */
     if (status == GateHWSpinlock_S_SUCCESS) {
         dst = (UInt32)mmap(NULL, _GateHWSpinlock_cfgParams.size,
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);
index 7d6fee3cc95aa340e853935fbe3189c15917b50d..a5c7e4c871c4b8fd10ef1e73d889a130ba84f54a 100644 (file)
@@ -38,6 +38,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
+#include <fcntl.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <unistd.h>
@@ -119,6 +120,7 @@ LAD_Status LAD_connect(LAD_ClientHandle * handle)
     double delta;
     Int assignedId;
     FILE * filePtr;
+    int flags;
     Int n;
     Int pid;
     struct LAD_CommandObj cmd;
@@ -178,6 +180,12 @@ LAD_Status LAD_connect(LAD_ClientHandle * handle)
         }
     }
 
+    /* make sure FIFO fd doesn't exist for 'fork() -> exec*()'ed child */
+    flags = fcntl(fileno(filePtr), F_GETFD);
+    if (flags != -1) {
+        fcntl(fileno(filePtr), F_SETFD, flags | FD_CLOEXEC);
+    }
+
     /* now get LAD's response to the connection request */
     n = fread(&rsp, LAD_RESPONSELENGTH, 1, filePtr);
 
@@ -380,6 +388,8 @@ static LAD_Status initWrappers(Void)
  */
 static Bool openCommandFIFO(Void)
 {
+    int flags;
+
     /* open a file for writing to FIFO */
     commandFIFOFilePtr = fopen(commandFIFOFileName, "w");
 
@@ -389,5 +399,11 @@ static Bool openCommandFIFO(Void)
         return(FALSE);
     }
 
+    /* make sure FIFO fd doesn't exist for 'fork() -> exec*()'ed child */
+    flags = fcntl(fileno(commandFIFOFilePtr), F_GETFD);
+    if (flags != -1) {
+        fcntl(fileno(commandFIFOFilePtr), F_SETFD, flags | FD_CLOEXEC);
+    }
+
     return(TRUE);
 }