Merge branch 'open-pipe-revert-2-74-backport' into 'glib-2-74'

Backport !3029 “Revert "Handling collision between standard i/o file descriptors and newly created ones" ” to glib-2-74

See merge request GNOME/glib!3039
This commit is contained in:
Ray Strode 2022-11-02 16:08:00 +00:00
commit fcdf5ebd81
2 changed files with 41 additions and 24 deletions

View File

@ -108,17 +108,6 @@ g_unix_open_pipe (int *fds,
ecode = pipe2 (fds, pipe2_flags); ecode = pipe2 (fds, pipe2_flags);
if (ecode == -1 && errno != ENOSYS) if (ecode == -1 && errno != ENOSYS)
return g_unix_set_error_from_errno (error, errno); 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) else if (ecode == 0)
return TRUE; return TRUE;
/* Fall through on -ENOSYS, we must be running on an old kernel */ /* Fall through on -ENOSYS, we must be running on an old kernel */
@ -127,19 +116,6 @@ g_unix_open_pipe (int *fds,
ecode = pipe (fds); ecode = pipe (fds);
if (ecode == -1) if (ecode == -1)
return g_unix_set_error_from_errno (error, errno); 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) if (flags == 0)
return TRUE; return TRUE;

View File

@ -24,8 +24,11 @@
#include "config.h" #include "config.h"
#include "glib-unix.h" #include "glib-unix.h"
#include "gstdio.h"
#include <string.h> #include <string.h>
#include <pwd.h> #include <pwd.h>
#include <unistd.h>
static void static void
test_pipe (void) test_pipe (void)
@ -52,6 +55,43 @@ test_pipe (void)
g_assert (g_str_has_prefix (buf, "hello")); g_assert (g_str_has_prefix (buf, "hello"));
} }
static void
test_pipe_stdio_overwrite (void)
{
GError *error = NULL;
int pipefd[2], ret;
gboolean res;
int stdin_fd;
g_test_summary ("Test that g_unix_open_pipe() will use the first available FD, even if its stdin/stdout/stderr");
g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2795");
stdin_fd = dup (STDIN_FILENO);
g_assert_cmpint (stdin_fd, >, 0);
g_close (STDIN_FILENO, &error);
g_assert_no_error (error);
res = g_unix_open_pipe (pipefd, FD_CLOEXEC, &error);
g_assert_no_error (error);
g_assert_true (res);
g_assert_cmpint (pipefd[0], ==, STDIN_FILENO);
g_close (pipefd[0], &error);
g_assert_no_error (error);
g_close (pipefd[1], &error);
g_assert_no_error (error);
ret = dup2 (stdin_fd, STDIN_FILENO);
g_assert_cmpint (ret, >=, 0);
g_close (stdin_fd, &error);
g_assert_no_error (error);
}
static void static void
test_error (void) test_error (void)
{ {
@ -337,6 +377,7 @@ main (int argc,
g_test_init (&argc, &argv, NULL); g_test_init (&argc, &argv, NULL);
g_test_add_func ("/glib-unix/pipe", test_pipe); g_test_add_func ("/glib-unix/pipe", test_pipe);
g_test_add_func ("/glib-unix/pipe-stdio-overwrite", test_pipe_stdio_overwrite);
g_test_add_func ("/glib-unix/error", test_error); g_test_add_func ("/glib-unix/error", test_error);
g_test_add_func ("/glib-unix/nonblocking", test_nonblocking); g_test_add_func ("/glib-unix/nonblocking", test_nonblocking);
g_test_add_func ("/glib-unix/sighup", test_sighup); g_test_add_func ("/glib-unix/sighup", test_sighup);