efl: don't leak fd on exec.
authorCedric BAIL <cedric.bail@free.fr>
Fri, 7 Dec 2012 11:01:41 +0000 (11:01 +0000)
committerCedric BAIL <cedric.bail@free.fr>
Fri, 7 Dec 2012 11:01:41 +0000 (11:01 +0000)
SVN revision: 80434

ChangeLog
NEWS
src/lib/ecore/ecore_main.c
src/lib/ecore/ecore_pipe.c
src/lib/ecore/ecore_private.h
src/lib/ecore_con/ecore_con_info.c
src/lib/ecore_file/ecore_file_monitor_inotify.c
src/lib/eina/eina_mmap.c
src/lib/eio/eio_monitor_inotify.c
src/lib/evas/canvas/evas_async_events.c
src/lib/evas/cserve2/evas_cs2_client.c

index 2a2a73b..e9353a4 100644 (file)
--- 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.
 
         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
 
         * 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 e00d027..a691df2 100644 (file)
--- 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.
index cc7b065..069283a 100644 (file)
@@ -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;
index 3caf978..de7e5f4 100644 (file)
@@ -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,
index a03dc9e..b9c11b5 100644 (file)
@@ -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)
index 80e199a..c734314 100644 (file)
@@ -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)
      {
index 9f9818d..be35646 100644 (file)
@@ -7,6 +7,7 @@
 #include <string.h>
 #include <sys/types.h>
 #include <unistd.h>
+#include <fcntl.h>
 
 #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)
index 0c4dec6..bed7e07 100644 (file)
@@ -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;
index 7650688..24c7d71 100644 (file)
@@ -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)
      {
index c8f114e..172b20f 100644 (file)
@@ -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];
 
index 7024de9..34879bb 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <sys/mman.h>
 #include <sys/stat.h>
+#include <unistd.h>
 #include <fcntl.h>
 
 #include <Eina.h>
@@ -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;
      }