diff --git a/src/evhelper.cpp b/src/evhelper.cpp index 2b90431..b530e17 100644 --- a/src/evhelper.cpp +++ b/src/evhelper.cpp @@ -320,15 +320,23 @@ evsocket::evsocket(evutil_socket_t sock) if(sock==evutil_socket_t(-1)) throw std::bad_alloc(); + evutil_make_socket_closeonexec(sock); + if(evutil_make_socket_nonblocking(sock)) { evutil_closesocket(sock); throw std::runtime_error("Unable to make non-blocking socket"); } } +// Linux specific way to atomically create a socket with O_CLOEXEC +#ifndef SOCK_CLOEXEC +# define SOCK_CLOEXEC 0 +#endif + evsocket::evsocket(int af, int type, int proto) - :evsocket(socket(af, type, proto)) -{} + :evsocket(socket(af, type | SOCK_CLOEXEC, proto)) +{ +} evsocket::evsocket(evsocket&& o) noexcept :sock(o.sock) diff --git a/src/serverconn.cpp b/src/serverconn.cpp index 6a183b9..fc4fb91 100644 --- a/src/serverconn.cpp +++ b/src/serverconn.cpp @@ -366,7 +366,7 @@ ServIface::ServIface(const std::string& addr, unsigned short port, server::Serve #endif const int backlog = 4; - listener = evlisten(evconnlistener_new(server->acceptor_loop.base, onConnS, this, LEV_OPT_DISABLED, backlog, sock.sock)); + listener = evlisten(evconnlistener_new(server->acceptor_loop.base, onConnS, this, LEV_OPT_DISABLED|LEV_OPT_CLOSE_ON_EXEC, backlog, sock.sock)); if(!LEV_OPT_DISABLED) evconnlistener_disable(listener.get());