From a48fc532519b849498c8b75dde578caf0c270b23 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Fri, 15 May 2009 10:42:28 +0200 Subject: [PATCH] Make cancellable pipe fds close-on-exec GCancellable is purely an in-process thing, so ensure that no cancellable fds accidentally leak to child processes. --- gio/gcancellable.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/gio/gcancellable.c b/gio/gcancellable.c index 39f8778f7..589b83a7f 100644 --- a/gio/gcancellable.c +++ b/gio/gcancellable.c @@ -188,6 +188,20 @@ set_fd_nonblocking (int fd) #endif } +static void +set_fd_close_exec (int fd) +{ + int flags; + + flags = fcntl (fd, F_GETFD, 0); + if (flags != -1 && (flags & FD_CLOEXEC) == 0) + { + flags |= FD_CLOEXEC; + fcntl (fd, F_SETFD, flags); + } +} + + static void g_cancellable_open_pipe (GCancellable *cancellable) { @@ -198,6 +212,8 @@ g_cancellable_open_pipe (GCancellable *cancellable) */ set_fd_nonblocking (cancellable->cancel_pipe[0]); set_fd_nonblocking (cancellable->cancel_pipe[1]); + set_fd_close_exec (cancellable->cancel_pipe[0]); + set_fd_close_exec (cancellable->cancel_pipe[1]); } else g_warning ("Failed to create pipe for GCancellable. Out of file descriptors?");