From 88ba56d9d539b5e5e87433b8b539cc69777a1025 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Fri, 7 Dec 2012 11:01:41 +0000 Subject: [PATCH] efl: don't leak fd on exec. SVN revision: 80434 --- ChangeLog | 15 +++++++----- NEWS | 1 + src/lib/ecore/ecore_main.c | 22 ++++++++++++++++++ src/lib/ecore/ecore_pipe.c | 3 +++ src/lib/ecore/ecore_private.h | 2 ++ src/lib/ecore_con/ecore_con_info.c | 23 +++++++++++++++++++ .../ecore_file/ecore_file_monitor_inotify.c | 10 ++++++++ src/lib/eina/eina_mmap.c | 11 +++++++++ src/lib/eio/eio_monitor_inotify.c | 9 ++++++++ src/lib/evas/canvas/evas_async_events.c | 23 +++++++++++++++++++ src/lib/evas/cserve2/evas_cs2_client.c | 11 +++++++++ 11 files changed, 124 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2a2a73b69a..e9353a4601 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,11 @@ +2012-12-07 Cedric Bail + + * Don't leak fd on exec. + 2012-12-07 Sung W. Park (sung_) * Added EVAS_GL_LINE_NO_OFFSET_HACK to turn off the line coordinate - fiddling that was originally in the gl backend code. The offset + fiddling that was originally in the gl backend code. The offset fiddling caused issues with some ARM target GPU drivers. * Fixed polygon rendering bug in GL backend when there are cutouts. @@ -53,6 +57,10 @@ textblock recalcs lead very badly. Required changed to textgrid though a sit relied on the leaky behavior. +2012-11-20 ChunEon Park (Hermet) + + * Fix the evas memory leak - eina_rectangles allocated internally. + 2012-11-16 Sung W. Park (sung_) * Fixed glGetIntegerv() in Direct Rendering mode for Evas GL @@ -135,8 +143,3 @@ * Fix EINA_INLIST_FOREACH_SAFE macro to work when inlist is not the first item in the struct. - -2012-11-20 ChunEon Park (Hermet) - - * Fix the evas memory leak - eina_rectangles allocated internally. - diff --git a/NEWS b/NEWS index e00d027f44..a691df2710 100644 --- a/NEWS +++ b/NEWS @@ -69,4 +69,5 @@ Fixes: * Fixed textblock textprop leak. * Fixed evas_object_box to reset size_hint_min to zero when no child. * Fix build of Ecore_Evas_Extn on Solaris. + * Don't leak fd on exec. * Fixed polygon rendering bug in GL backend when there are cutouts. diff --git a/src/lib/ecore/ecore_main.c b/src/lib/ecore/ecore_main.c index cc7b0654a5..069283ac21 100644 --- a/src/lib/ecore/ecore_main.c +++ b/src/lib/ecore/ecore_main.c @@ -270,6 +270,26 @@ static gboolean _ecore_glib_idle_enterer_called; static gboolean ecore_fds_ready; #endif +Eina_Bool +_ecore_fd_close_on_exec(int fd) +{ +#ifdef HAVE_EXECVP + int flags; + + flags = fcntl(fd, F_GETFD); + if (flags == -1) + return EINA_FALSE; + + flags |= FD_CLOEXEC; + if (fcntl(fd, F_SETFD, flags) == -1) + return EINA_FALSE; + return EINA_TRUE; +#else + (void) fd; + return EINA_FALSE; +#endif +} + static inline void _ecore_fd_valid(void) { @@ -754,6 +774,7 @@ _ecore_main_loop_init(void) if (epoll_fd < 0) WRN("Failed to create epoll fd!"); epoll_pid = getpid(); + _ecore_fd_close_on_exec(epoll_fd); /* add polls on all our file descriptors */ Ecore_Fd_Handler *fdh; @@ -789,6 +810,7 @@ _ecore_main_loop_init(void) WRN("failed to create timer fd!"); else { + _ecore_fd_close_on_exec(timer_fd); ecore_timer_fd.fd = timer_fd; ecore_timer_fd.events = G_IO_IN; ecore_timer_fd.revents = 0; diff --git a/src/lib/ecore/ecore_pipe.c b/src/lib/ecore/ecore_pipe.c index 3caf9781d0..de7e5f4e78 100644 --- a/src/lib/ecore/ecore_pipe.c +++ b/src/lib/ecore/ecore_pipe.c @@ -415,6 +415,9 @@ _ecore_pipe_add(Ecore_Pipe_Cb handler, p->handler = handler; p->data = data; + _ecore_fd_close_on_exec(fds[0]); + _ecore_fd_close_on_exec(fds[1]); + fcntl(p->fd_read, F_SETFL, O_NONBLOCK); p->fd_handler = ecore_main_fd_handler_add(p->fd_read, ECORE_FD_READ, diff --git a/src/lib/ecore/ecore_private.h b/src/lib/ecore/ecore_private.h index a03dc9ed22..b9c11b5da8 100644 --- a/src/lib/ecore/ecore_private.h +++ b/src/lib/ecore/ecore_private.h @@ -186,6 +186,8 @@ Ecore_Fd_Handler * const void *buf_data); void *_ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler); +Eina_Bool _ecore_fd_close_on_exec(int fd); + void _ecore_main_shutdown(void); #if defined (_WIN32) || defined (__lv2ppu__) || defined (HAVE_EXOTIC) diff --git a/src/lib/ecore_con/ecore_con_info.c b/src/lib/ecore_con/ecore_con_info.c index 80e199a411..c734314be4 100644 --- a/src/lib/ecore_con/ecore_con_info.c +++ b/src/lib/ecore_con/ecore_con_info.c @@ -205,6 +205,26 @@ ecore_con_info_mcast_listen(Ecore_Con_Server *svr, return ecore_con_info_get(svr, done_cb, data, &hints); } +Eina_Bool +_ecore_fd_close_on_exec(int fd) +{ +#ifdef HAVE_EXECVP + int flags; + + flags = fcntl(fd, F_GETFD); + if (flags == -1) + return EINA_FALSE; + + flags |= FD_CLOEXEC; + if (fcntl(fd, F_SETFD, flags) == -1) + return EINA_FALSE; + return EINA_TRUE; +#else + (void) fd; + return EINA_FALSE; +#endif +} + EAPI int ecore_con_info_get(Ecore_Con_Server *svr, Ecore_Con_Info_Cb done_cb, @@ -220,6 +240,9 @@ ecore_con_info_get(Ecore_Con_Server *svr, return 0; } + _ecore_fd_close_on_exec(fd[0]); + _ecore_fd_close_on_exec(fd[1]); + cbdata = calloc(1, sizeof(CB_Data)); if (!cbdata) { diff --git a/src/lib/ecore_file/ecore_file_monitor_inotify.c b/src/lib/ecore_file/ecore_file_monitor_inotify.c index 9f9818dcd7..be3564602f 100644 --- a/src/lib/ecore_file/ecore_file_monitor_inotify.c +++ b/src/lib/ecore_file/ecore_file_monitor_inotify.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "ecore_file_private.h" @@ -49,11 +50,20 @@ int ecore_file_monitor_backend_init(void) { int fd; +#ifdef HAVE_EXECVP + int flags; +#endif fd = inotify_init(); if (fd < 0) return 0; +#ifdef HAVE_EXECVP + flags = fcntl(fd, F_GETFD); + flags |= FD_CLOEXEC; + fcntl(fd, F_SETFD, flags); +#endif + _fdh = ecore_main_fd_handler_add(fd, ECORE_FD_READ, _ecore_file_monitor_inotify_handler, NULL, NULL, NULL); if (!_fdh) diff --git a/src/lib/eina/eina_mmap.c b/src/lib/eina/eina_mmap.c index 0c4dec6b4b..bed7e07d08 100644 --- a/src/lib/eina/eina_mmap.c +++ b/src/lib/eina/eina_mmap.c @@ -156,9 +156,20 @@ eina_mmap_safety_enabled_set(Eina_Bool enabled) /* no zero page device - open it */ if (_eina_mmap_zero_fd < 0) { +#ifdef HAVE_EXECVP + int flags; +#endif + _eina_mmap_zero_fd = open("/dev/zero", O_RDWR); /* if we don;'t have one - fail to set up mmap safety */ if (_eina_mmap_zero_fd < 0) return EINA_FALSE; + +#ifdef HAVE_EXECVP + flags = fcntl(_eina_mmap_zero_fd, F_GETFD); + flags |= FD_CLOEXEC; + fcntl(_eina_mmap_zero_fd, F_SETFD, flags); +#endif + } /* set up signal handler for SIGBUS */ sa.sa_sigaction = _eina_mmap_safe_sigbus; diff --git a/src/lib/eio/eio_monitor_inotify.c b/src/lib/eio/eio_monitor_inotify.c index 7650688347..24c7d7120e 100644 --- a/src/lib/eio/eio_monitor_inotify.c +++ b/src/lib/eio/eio_monitor_inotify.c @@ -161,11 +161,20 @@ _eio_inotify_handler(void *data EINA_UNUSED, Ecore_Fd_Handler *fdh) void eio_monitor_backend_init(void) { int fd; +#ifdef HAVE_EXECVP + int flags; +#endif fd = inotify_init(); if (fd < 0) return ; +#ifdef HAVE_EXECVP + flags = fcntl(fd, F_GETFD); + flags |= FD_CLOEXEC; + fcntl(fd, F_SETFD, flags); +#endif + _inotify_fdh = ecore_main_fd_handler_add(fd, ECORE_FD_READ, _eio_inotify_handler, NULL, NULL, NULL); if (!_inotify_fdh) { diff --git a/src/lib/evas/canvas/evas_async_events.c b/src/lib/evas/canvas/evas_async_events.c index c8f114e484..172b20f844 100644 --- a/src/lib/evas/canvas/evas_async_events.c +++ b/src/lib/evas/canvas/evas_async_events.c @@ -27,6 +27,26 @@ struct _Evas_Event_Async Evas_Callback_Type type; }; +Eina_Bool +_evas_fd_close_on_exec(int fd) +{ +#ifdef HAVE_EXECVP + int flags; + + flags = fcntl(fd, F_GETFD); + if (flags == -1) + return EINA_FALSE; + + flags |= FD_CLOEXEC; + if (fcntl(fd, F_SETFD, flags) == -1) + return EINA_FALSE; + return EINA_TRUE; +#else + (void) fd; + return EINA_FALSE; +#endif +} + int evas_async_events_init(void) { @@ -43,6 +63,9 @@ evas_async_events_init(void) return 0; } + _evas_fd_close_on_exec(filedes[0]); + _evas_fd_close_on_exec(filedes[1]); + _fd_read = filedes[0]; _fd_write = filedes[1]; diff --git a/src/lib/evas/cserve2/evas_cs2_client.c b/src/lib/evas/cserve2/evas_cs2_client.c index 7024de9a89..34879bbdd1 100644 --- a/src/lib/evas/cserve2/evas_cs2_client.c +++ b/src/lib/evas/cserve2/evas_cs2_client.c @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -86,6 +87,9 @@ _server_connect(void) { int s, len; struct sockaddr_un remote; +#ifdef HAVE_EXECVP + int flags; +#endif if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { @@ -93,12 +97,19 @@ _server_connect(void) return EINA_FALSE; } +#ifdef HAVE_EXECVP + flags = fcntl(s, F_GETFD); + flags |= FD_CLOEXEC; + fcntl(s, F_SETFD, flags); +#endif + remote.sun_family = AF_UNIX; _socket_path_set(remote.sun_path); len = strlen(remote.sun_path) + sizeof(remote.sun_family); if (connect(s, (struct sockaddr *)&remote, len) == -1) { ERR("connect"); + close(s); return EINA_FALSE; }