osaf/libs/core/mds/mds_dt_tcp.c  |  23 +++++++-------------
 osaf/libs/core/mds/mds_dt_tipc.c |  43 ++++++++-------------------------------
 2 files changed, 17 insertions(+), 49 deletions(-)


To avoid a potential race between fcntl(FD_CLOEXEC) in one thread and exec() in
another thread, use the SOCK_CLOEXEC flag when creating sockets.

diff --git a/osaf/libs/core/mds/mds_dt_tcp.c b/osaf/libs/core/mds/mds_dt_tcp.c
--- a/osaf/libs/core/mds/mds_dt_tcp.c
+++ b/osaf/libs/core/mds/mds_dt_tcp.c
@@ -38,6 +38,13 @@
 #include <arpa/inet.h>
 #include <configmake.h>
 
+#ifndef SOCK_CLOEXEC
+enum {
+       SOCK_CLOEXEC = 0x80000
+};
+#define SOCK_CLOEXEC SOCK_CLOEXEC
+#endif
+
 #define MDS_MDTM_SUN_PATH 255
 #define MDS_MDTM_CONNECT_PATH PKGLOCALSTATEDIR "/osaf_dtm_intra_server"
 
@@ -81,7 +88,6 @@ uint32_t mdtm_process_recv_events_tcp(vo
  */
 uint32_t mds_mdtm_init_tcp(NODE_ID nodeid, uint32_t *mds_tcp_ref)
 {
-       uint32_t flags;
        uint32_t sndbuf_size = 0; /* Send buffer size */
        uint32_t rcvbuf_size = 0;  /* Receive buffer size */
        socklen_t optlen; /* Option length */
@@ -125,7 +131,7 @@ uint32_t mds_mdtm_init_tcp(NODE_ID nodei
 
        /* Create the sockets required for Binding, Send, receive and Discovery 
*/
 
-       tcp_cb->DBSRsock = socket(mds_socket_domain, SOCK_STREAM|SOCK_CLOEXEC, 
0);
+       tcp_cb->DBSRsock = socket(mds_socket_domain, SOCK_STREAM | 
SOCK_CLOEXEC, 0);
        if (tcp_cb->DBSRsock < 0) {
                syslog(LOG_ERR, "MDTM:TCP DBSRsock Socket creation failed in 
MDTM_INIT err :%s", strerror(errno));
                return NCSCC_RC_FAILURE;
@@ -177,19 +183,6 @@ uint32_t mds_mdtm_init_tcp(NODE_ID nodei
                return NCSCC_RC_FAILURE;
        }
 
-       flags = fcntl(tcp_cb->DBSRsock, F_GETFD, 0);
-       if ((flags < 0) || (flags > 1)) {
-               syslog(LOG_ERR, "MDTM:TCP Unable to get the CLOEXEC Flag on 
DBSRsock  err :%s", strerror(errno));
-               close(tcp_cb->DBSRsock);
-               return NCSCC_RC_FAILURE;
-       } else {
-               if (fcntl(tcp_cb->DBSRsock, F_SETFD, (flags | FD_CLOEXEC)) == 
(-1)) {
-                       syslog(LOG_ERR, "MDTM:TCP Unable to set the CLOEXEC 
Flag on DBSRsock err :%s", strerror(errno));
-                       close(tcp_cb->DBSRsock);
-                       return NCSCC_RC_FAILURE;
-               }
-       }
-
        tcp_cb->adest = ((uint64_t)(nodeid)) << 32;
        tcp_cb->adest |= mdtm_pid;
        tcp_cb->node_id = nodeid;
diff --git a/osaf/libs/core/mds/mds_dt_tipc.c b/osaf/libs/core/mds/mds_dt_tipc.c
--- a/osaf/libs/core/mds/mds_dt_tipc.c
+++ b/osaf/libs/core/mds/mds_dt_tipc.c
@@ -45,6 +45,13 @@
 #include "mds_core.h"
 #include "osaf_utility.h"
 
+#ifndef SOCK_CLOEXEC
+enum {
+       SOCK_CLOEXEC = 0x80000
+};
+#define SOCK_CLOEXEC SOCK_CLOEXEC
+#endif
+
 /*
     tipc_id will be <NODE_ID,RANDOM NUMBER>
 */
@@ -151,7 +158,6 @@ uint32_t mdtm_global_frag_num;
 uint32_t mdtm_tipc_init(NODE_ID nodeid, uint32_t *mds_tipc_ref)
 {
        uint32_t tipc_node_id = 0;
-       int flags;
 
        NCS_PATRICIA_PARAMS pat_tree_params;
 
@@ -176,48 +182,17 @@ uint32_t mdtm_tipc_init(NODE_ID nodeid, 
 
        /* Create the sockets required for Binding, Send, receive and Discovery 
*/
 
-       tipc_cb.Dsock = socket(AF_TIPC, SOCK_SEQPACKET, 0);
+       tipc_cb.Dsock = socket(AF_TIPC, SOCK_SEQPACKET | SOCK_CLOEXEC, 0);
        if (tipc_cb.Dsock < 0) {
                syslog(LOG_ERR, "MDTM:TIPC Dsock Socket creation failed in 
MDTM_INIT err :%s", strerror(errno));
                return NCSCC_RC_FAILURE;
        }
-       tipc_cb.BSRsock = socket(AF_TIPC, SOCK_RDM, 0);
+       tipc_cb.BSRsock = socket(AF_TIPC, SOCK_RDM | SOCK_CLOEXEC, 0);
        if (tipc_cb.BSRsock < 0) {
                syslog(LOG_ERR, "MDTM:TIPC BSRsock Socket creation failed in 
MDTM_INIT err :%s", strerror(errno));
                return NCSCC_RC_FAILURE;
        }
 
-       flags = fcntl(tipc_cb.Dsock, F_GETFD, 0);
-       if ((flags < 0) || (flags > 1)) {
-               syslog(LOG_ERR, "MDTM:TIPC Unable to get the CLOEXEC Flag on 
Dsock err :%s", strerror(errno));
-               close(tipc_cb.Dsock);
-               close(tipc_cb.BSRsock);
-               return NCSCC_RC_FAILURE;
-       } else {
-               if (fcntl(tipc_cb.Dsock, F_SETFD, (flags | FD_CLOEXEC)) == 
(-1)) {
-                       syslog(LOG_ERR, "MDTM:TIPC Unable to set the CLOEXEC 
Flag on Dsock err :%s", strerror(errno));
-                       close(tipc_cb.Dsock);
-                       close(tipc_cb.BSRsock);
-                       return NCSCC_RC_FAILURE;
-               }
-       }
-
-       flags = fcntl(tipc_cb.BSRsock, F_GETFD, 0);
-       if ((flags < 0) || (flags > 1)) {
-               syslog(LOG_ERR, "MDTM:TIPC Unable to get the CLOEXEC Flag on 
BSRsock err :%s", strerror(errno));
-               close(tipc_cb.Dsock);
-               close(tipc_cb.BSRsock);
-               return NCSCC_RC_FAILURE;
-       } else {
-               if (fcntl(tipc_cb.BSRsock, F_SETFD, (flags | FD_CLOEXEC)) == 
(-1)) {
-                       syslog(LOG_ERR, "MDTM:TIPC Unable to set the CLOEXEC 
Flag on BSRsock err :%s", strerror(errno));
-                       close(tipc_cb.Dsock);
-                       close(tipc_cb.BSRsock);
-                       return NCSCC_RC_FAILURE;
-               }
-       }
-       /* End Fix */
-
        /* Code for getting the self tipc random number */
        memset(&addr, 0, sizeof(addr));
        if (0 > getsockname(tipc_cb.BSRsock, (struct sockaddr *)&addr, &sz)) {

------------------------------------------------------------------------------
Developer Access Program for Intel Xeon Phi Processors
Access to Intel Xeon Phi processor-based developer platforms.
With one year of Intel Parallel Studio XE.
Training and support from Colfax.
Order your platform today. http://sdm.link/xeonphi
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to