[glib/gio-thumbnail-sizes: 1/14] Handling collision between standard i/o file descriptors and newly created ones




commit 00d56f5ea9183f21a009220406c84249bbb66445
Author: Emmanuel Fleury <emmanuel fleury gmail com>
Date:   Mon Aug 1 19:05:14 2022 +0200

    Handling collision between standard i/o file descriptors and newly created ones
    
    Though unlikely to happen, it may happen that newly created file
    descriptor take the value 0 (stdin), 1 (stdout) or 2 (stderr) if one
    of the standard ones have been dismissed in between. So, it may
    confuse the program if it is unaware of this change.
    
    The point of this patch is to avoid a reasign of standard file
    descriptors on newly created ones.
    
    Closes issue #16

 glib/glib-unix.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)
---
diff --git a/glib/glib-unix.c b/glib/glib-unix.c
index bc152d7663..4710c51168 100644
--- a/glib/glib-unix.c
+++ b/glib/glib-unix.c
@@ -108,6 +108,17 @@ g_unix_open_pipe (int     *fds,
     ecode = pipe2 (fds, pipe2_flags);
     if (ecode == -1 && errno != ENOSYS)
       return g_unix_set_error_from_errno (error, errno);
+    /* Don't reassign pipes to stdin, stdout, stderr if closed meanwhile */
+    else if (fds[0] < 3 || fds[1] < 3)
+      {
+        int old_fds[2] = { fds[0], fds[1] };
+        gboolean result = g_unix_open_pipe (fds, flags, error);
+        close (old_fds[0]);
+        close (old_fds[1]);
+
+        if (!result)
+          g_unix_set_error_from_errno (error, errno);
+      }
     else if (ecode == 0)
       return TRUE;
     /* Fall through on -ENOSYS, we must be running on an old kernel */
@@ -116,6 +127,19 @@ g_unix_open_pipe (int     *fds,
   ecode = pipe (fds);
   if (ecode == -1)
     return g_unix_set_error_from_errno (error, errno);
+  /* Don't reassign pipes to stdin, stdout, stderr if closed meanwhile */
+  else if (fds[0] < 3 || fds[1] < 3)
+    {
+      int old_fds[2] = { fds[0], fds[1] };
+      gboolean result = g_unix_open_pipe (fds, flags, error);
+      close (old_fds[0]);
+      close (old_fds[1]);
+
+      if (!result)
+        g_unix_set_error_from_errno (error, errno);
+
+      return result;
+    }
 
   if (flags == 0)
     return TRUE;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]