Hi Anders Widell, Correction, I am using Linux kernel 3.0.13-0.27
uname -r 3.0.13-0.27-default -AVM On 11/21/2016 11:16 AM, A V Mahesh wrote: > Hi Anders Widell, > > It seems SOCK_CLOEXEC is unsupported on Linux kernel older than 2.6.27, > for example I am currently using : > > # uname -r > 2.6.18-308.1.1.el5 > > It looks EINVAL is what socket returns if it does not support > SOCK_CLOEXEC, may be we need to do > ` flags = fcntl(tcp_cb->DBSRsock, F_GETFD, 0);` in else case of > SOCK_CLOEXEC is unsupported on Linux kernel, > can you please cross check. > > -AVMC > > > On 11/10/2016 4:58 PM, Anders Widell wrote: >> 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)) { > > ------------------------------------------------------------------------------ > _______________________________________________ > Opensaf-devel mailing list > Opensaf-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/opensaf-devel ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel