efl: don't leak fd on exec.

SVN revision: 80434
This commit is contained in:
Cedric BAIL 2012-12-07 11:01:41 +00:00
parent 931e4f9325
commit 88ba56d9d5
11 changed files with 124 additions and 6 deletions

View File

@ -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.

1
NEWS
View File

@ -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.

View 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;

View 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,

View 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)

View 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)
{

View 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)

View 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;

View 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)
{

View 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];

View 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;
}