mirror of
https://github.com/zeromq/libzmq.git
synced 2025-09-17 19:44:01 +02:00
Problem: code duplication in making sockets non-inheritable
Solution: extracted make_socket_noninheritable function
This commit is contained in:
parent
c432aada84
commit
44da0e7e42
52
src/ip.cpp
52
src/ip.cpp
@ -84,19 +84,7 @@ zmq::fd_t zmq::open_socket (int domain_, int type_, int protocol_)
|
||||
return retired_fd;
|
||||
}
|
||||
|
||||
// If there's no SOCK_CLOEXEC, let's try the second best option. Note that
|
||||
// race condition can cause socket not to be closed (if fork happens
|
||||
// between socket creation and this point).
|
||||
#if !defined ZMQ_HAVE_SOCK_CLOEXEC && defined FD_CLOEXEC
|
||||
rc = fcntl (s, F_SETFD, FD_CLOEXEC);
|
||||
errno_assert (rc != -1);
|
||||
#endif
|
||||
|
||||
// On Windows, preventing sockets to be inherited by child processes.
|
||||
#if defined ZMQ_HAVE_WINDOWS && defined HANDLE_FLAG_INHERIT
|
||||
BOOL brc = SetHandleInformation ((HANDLE) s, HANDLE_FLAG_INHERIT, 0);
|
||||
win_assert (brc);
|
||||
#endif
|
||||
make_socket_noninheritable (s);
|
||||
|
||||
// Socket is not yet connected so EINVAL is not a valid networking error
|
||||
rc = zmq::set_nosigpipe (s);
|
||||
@ -521,11 +509,7 @@ int zmq::make_fdpair (fd_t *r_, fd_t *w_)
|
||||
}
|
||||
|
||||
if (*r_ != INVALID_SOCKET) {
|
||||
#if !defined _WIN32_WCE && !defined ZMQ_HAVE_WINDOWS_UWP
|
||||
// On Windows, preventing sockets to be inherited by child processes.
|
||||
BOOL brc = SetHandleInformation ((HANDLE) *r_, HANDLE_FLAG_INHERIT, 0);
|
||||
win_assert (brc);
|
||||
#endif
|
||||
make_socket_noninheritable (*r_);
|
||||
return 0;
|
||||
} else {
|
||||
// Cleanup writer if connection failed
|
||||
@ -650,18 +634,32 @@ int zmq::make_fdpair (fd_t *r_, fd_t *w_)
|
||||
*w_ = *r_ = -1;
|
||||
return -1;
|
||||
} else {
|
||||
// If there's no SOCK_CLOEXEC, let's try the second best option. Note that
|
||||
// race condition can cause socket not to be closed (if fork happens
|
||||
// between socket creation and this point).
|
||||
#if !defined ZMQ_HAVE_SOCK_CLOEXEC && defined FD_CLOEXEC
|
||||
rc = fcntl (sv[0], F_SETFD, FD_CLOEXEC);
|
||||
errno_assert (rc != -1);
|
||||
rc = fcntl (sv[1], F_SETFD, FD_CLOEXEC);
|
||||
errno_assert (rc != -1);
|
||||
#endif
|
||||
make_socket_noninheritable (sv[0]);
|
||||
make_socket_noninheritable (sv[1]);
|
||||
|
||||
*w_ = sv[0];
|
||||
*r_ = sv[1];
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void zmq::make_socket_noninheritable (fd_t sock)
|
||||
{
|
||||
#if defined ZMQ_HAVE_WINDOWS && !defined _WIN32_WCE \
|
||||
&& !defined ZMQ_HAVE_WINDOWS_UWP
|
||||
// On Windows, preventing sockets to be inherited by child processes.
|
||||
const BOOL brc = SetHandleInformation (reinterpret_cast<HANDLE> (sock),
|
||||
HANDLE_FLAG_INHERIT, 0);
|
||||
win_assert (brc);
|
||||
#endif
|
||||
|
||||
#if (!defined ZMQ_HAVE_SOCK_CLOEXEC || !defined HAVE_ACCEPT4) \
|
||||
&& defined FD_CLOEXEC
|
||||
// If there 's no SOCK_CLOEXEC, let's try the second best option.
|
||||
// Race condition can cause socket not to be closed (if fork happens
|
||||
// between accept and this point).
|
||||
const int rc = fcntl (sock, F_SETFD, FD_CLOEXEC);
|
||||
errno_assert (rc != -1);
|
||||
#endif
|
||||
}
|
||||
|
@ -67,6 +67,10 @@ void shutdown_network ();
|
||||
// Creates a pair of sockets (using signaler_port on OS using TCP sockets).
|
||||
// Returns -1 if we could not make the socket pair successfully
|
||||
int make_fdpair (fd_t *r_, fd_t *w_);
|
||||
|
||||
// Makes a socket non-inheritable to child processes.
|
||||
// Asserts on any failure.
|
||||
void make_socket_noninheritable (fd_t sock);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -403,13 +403,7 @@ zmq::fd_t zmq::ipc_listener_t::accept ()
|
||||
return retired_fd;
|
||||
}
|
||||
|
||||
#if (!defined ZMQ_HAVE_SOCK_CLOEXEC || !defined HAVE_ACCEPT4) \
|
||||
&& defined FD_CLOEXEC
|
||||
// Race condition can cause socket not to be closed (if fork happens
|
||||
// between accept and this point).
|
||||
int rc = fcntl (sock, F_SETFD, FD_CLOEXEC);
|
||||
errno_assert (rc != -1);
|
||||
#endif
|
||||
make_socket_noninheritable (sock);
|
||||
|
||||
// IPC accept() filters
|
||||
#if defined ZMQ_HAVE_SO_PEERCRED || defined ZMQ_HAVE_LOCAL_PEERCRED
|
||||
|
@ -198,12 +198,7 @@ int zmq::tcp_listener_t::set_address (const char *addr_)
|
||||
if (s == retired_fd) {
|
||||
return -1;
|
||||
}
|
||||
#if defined ZMQ_HAVE_WINDOWS && !defined _WIN32_WCE \
|
||||
&& !defined ZMQ_HAVE_WINDOWS_UWP
|
||||
// On Windows, preventing sockets to be inherited by child processes.
|
||||
BOOL brc = SetHandleInformation ((HANDLE) s, HANDLE_FLAG_INHERIT, 0);
|
||||
win_assert (brc);
|
||||
#endif
|
||||
make_socket_noninheritable (s);
|
||||
|
||||
// On some systems, IPv4 mapping in IPv6 sockets is disabled by default.
|
||||
// Switch it on in such cases.
|
||||
@ -315,20 +310,7 @@ zmq::fd_t zmq::tcp_listener_t::accept ()
|
||||
return retired_fd;
|
||||
}
|
||||
|
||||
#if defined ZMQ_HAVE_WINDOWS && !defined _WIN32_WCE \
|
||||
&& !defined ZMQ_HAVE_WINDOWS_UWP
|
||||
// On Windows, preventing sockets to be inherited by child processes.
|
||||
BOOL brc = SetHandleInformation ((HANDLE) sock, HANDLE_FLAG_INHERIT, 0);
|
||||
win_assert (brc);
|
||||
#endif
|
||||
|
||||
#if (!defined ZMQ_HAVE_SOCK_CLOEXEC || !defined HAVE_ACCEPT4) \
|
||||
&& defined FD_CLOEXEC
|
||||
// Race condition can cause socket not to be closed (if fork happens
|
||||
// between accept and this point).
|
||||
int rc = fcntl (sock, F_SETFD, FD_CLOEXEC);
|
||||
errno_assert (rc != -1);
|
||||
#endif
|
||||
make_socket_noninheritable (sock);
|
||||
|
||||
if (!options.tcp_accept_filters.empty ()) {
|
||||
bool matched = false;
|
||||
|
Loading…
x
Reference in New Issue
Block a user