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

Reply via email to