GCancellable: Use g_unix_pipe_flags with FD_CLOEXEC
authorColin Walters <walters@verbum.org>
Mon, 2 May 2011 19:42:51 +0000 (15:42 -0400)
committerColin Walters <walters@verbum.org>
Tue, 3 May 2011 14:14:48 +0000 (10:14 -0400)
The old code was creating a pipe and setting FD_CLOEXEC
non-atomically.

https://bugzilla.gnome.org/show_bug.cgi?id=649225

gio/gcancellable.c

index 32f5081..5a078b4 100644 (file)
@@ -194,34 +194,18 @@ g_cancellable_class_init (GCancellableClass *klass)
 #ifndef G_OS_WIN32
 
 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)
 {
   GCancellablePrivate *priv;
 
   priv = cancellable->priv;
-  if (pipe (priv->cancel_pipe) == 0)
+  if (g_unix_pipe_flags (priv->cancel_pipe, FD_CLOEXEC, NULL))
     {
       /* Make them nonblocking, just to be sure we don't block
        * on errors and stuff
        */
       g_unix_set_fd_nonblocking (priv->cancel_pipe[0], TRUE, NULL);
       g_unix_set_fd_nonblocking (priv->cancel_pipe[1], TRUE, NULL);
-      set_fd_close_exec (priv->cancel_pipe[0]);
-      set_fd_close_exec (priv->cancel_pipe[1]);
       
       if (priv->cancelled)
         {