diff options
author | Sumit Bose <sbose@redhat.com> | 2011-08-11 12:30:48 +0200 |
---|---|---|
committer | Simo Sorce <idra@samba.org> | 2011-08-11 14:38:53 -0400 |
commit | 158b208dfd75c04698f9f9196161322b16a020a2 (patch) | |
tree | a81837ad3fe0d4c707e16c080f782b0ca441b576 /lib/tevent/tevent_standard.c | |
parent | d52343a9673a55e0e11d35f904808c0007405fa4 (diff) | |
download | samba-158b208dfd75c04698f9f9196161322b16a020a2.tar.gz samba-158b208dfd75c04698f9f9196161322b16a020a2.tar.bz2 samba-158b208dfd75c04698f9f9196161322b16a020a2.zip |
tevent: Set FD_CLOEXEC on epoll handle
If an application using libtevent starts a new process the epoll file descriptor
is leaked to the new process if the event context is not freed explicitly. By
setting FD_CLOEXEC this is not needed anymore.
Signed-off-by: Simo Sorce <idra@samba.org>
Diffstat (limited to 'lib/tevent/tevent_standard.c')
-rw-r--r-- | lib/tevent/tevent_standard.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/tevent/tevent_standard.c b/lib/tevent/tevent_standard.c index 35f7ded9b7..e2ca44f9c2 100644 --- a/lib/tevent/tevent_standard.c +++ b/lib/tevent/tevent_standard.c @@ -100,6 +100,17 @@ static int epoll_ctx_destructor(struct std_event_context *std_ev) static void epoll_init_ctx(struct std_event_context *std_ev) { std_ev->epoll_fd = epoll_create(64); + if (std_ev->epoll_fd == -1) { + tevent_debug(std_ev->ev, TEVENT_DEBUG_FATAL, + "Failed to create epoll handle.\n"); + return; + } + + if (!ev_set_close_on_exec(std_ev->epoll_fd)) { + tevent_debug(std_ev->ev, TEVENT_DEBUG_WARNING, + "Failed to set close-on-exec, file descriptor may be leaked to children.\n"); + } + std_ev->pid = getpid(); talloc_set_destructor(std_ev, epoll_ctx_destructor); } @@ -126,6 +137,12 @@ static void epoll_check_reopen(struct std_event_context *std_ev) "Failed to recreate epoll handle after fork\n"); return; } + + if (!ev_set_close_on_exec(std_ev->epoll_fd)) { + tevent_debug(std_ev->ev, TEVENT_DEBUG_WARNING, + "Failed to set close-on-exec, file descriptor may be leaked to children.\n"); + } + std_ev->pid = getpid(); for (fde=std_ev->ev->fd_events;fde;fde=fde->next) { epoll_add_event(std_ev, fde); |