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