osaf/libs/core/leap/os_defs.c   |  20 +-------------------
 osaf/libs/core/leap/sysf_mem.c  |   2 +-
 osaf/libs/core/mds/mds_dt_tcp.c |  16 +---------------
 3 files changed, 3 insertions(+), 35 deletions(-)


Since Linux 2.6.27, socketpair() supports the SOCK_NONBLOCK and SOCK_CLOEXEC 
flags described in socket(2).
Linux glibc 2.7 introduced the e flag to cause a close-on-exec flag upon open.
So optimized the code, this is useful as it avoid a race condition between 
fopen() and a subsequent call to fcntl().

diff --git a/osaf/libs/core/leap/os_defs.c b/osaf/libs/core/leap/os_defs.c
--- a/osaf/libs/core/leap/os_defs.c
+++ b/osaf/libs/core/leap/os_defs.c
@@ -1060,21 +1060,11 @@ uint32_t ncs_sel_obj_create(NCS_SEL_OBJ 
        int s_pair[2];
        int flags = 0;
 
-       osaf_mutex_lock_ordie(&s_cloexec_mutex);
-       if (0 != socketpair(AF_UNIX, SOCK_STREAM, 0, s_pair)) {
+       if (0 != socketpair(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0, s_pair)) {
                syslog(LOG_ERR, "%s: socketpair failed - %s", __FUNCTION__, 
strerror(errno));
-               osaf_mutex_unlock_ordie(&s_cloexec_mutex);
                return NCSCC_RC_FAILURE;
        }
 
-       flags = fcntl(s_pair[0], F_GETFD, 0);
-       fcntl(s_pair[0], F_SETFD, (flags | FD_CLOEXEC));
-
-       flags = fcntl(s_pair[1], F_GETFD, 0);
-       fcntl(s_pair[1], F_SETFD, (flags | FD_CLOEXEC));
-
-       osaf_mutex_unlock_ordie(&s_cloexec_mutex);
-
        if (s_pair[0] > s_pair[1]) {
                /* Ensure s_pair[1] is equal or greater */
                int temp = s_pair[0];
@@ -1293,18 +1283,10 @@ int ncs_sel_obj_rmv_ind(NCS_SEL_OBJ *i_i
 FILE *ncs_os_fopen(const char *fpath, const char *fmode)
 {
        FILE *fp = NULL;
-       int flags = 0;
-       osaf_mutex_lock_ordie(&s_cloexec_mutex);
        fp = fopen(fpath, fmode);
        if (fp == NULL) {
-               osaf_mutex_unlock_ordie(&s_cloexec_mutex);
                return NULL;
        }
 
-       flags = fcntl(fileno(fp), F_GETFD, 0);
-       fcntl(fileno(fp), F_SETFD, (flags | FD_CLOEXEC));
-
-       osaf_mutex_unlock_ordie(&s_cloexec_mutex);
-
        return fp;
 }
diff --git a/osaf/libs/core/leap/sysf_mem.c b/osaf/libs/core/leap/sysf_mem.c
--- a/osaf/libs/core/leap/sysf_mem.c
+++ b/osaf/libs/core/leap/sysf_mem.c
@@ -1917,7 +1917,7 @@ uint32_t sysf_pick_output(char *str, cha
        FILE *file;
 
        if (fname != NULL) {
-               if ((file = ncs_os_fopen(fname, "at")) == NULL)
+               if ((file = ncs_os_fopen(fname, "ate")) == NULL)
                        return NCSCC_RC_FAILURE;
                fprintf(file, "%s\n", str);
                fclose(file);
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
@@ -81,7 +81,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 +124,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, 0);
+       tcp_cb->DBSRsock = socket(mds_socket_domain, SOCK_STREAM|SOCK_CLOEXEC, 
0);
        if (tcp_cb->DBSRsock < 0) {
                syslog(LOG_ERR, "MDS:MDTM:TCP DBSRsock Socket creation failed 
in MDTM_INIT err :%s", strerror(errno));
                return NCSCC_RC_FAILURE;
@@ -177,19 +176,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, "MDS: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, "MDS: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;

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to