mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-01-12 15:36:17 +01:00
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:
commit
fcdf5ebd81
@ -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;
|
||||||
|
@ -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 it’s 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);
|
||||||
|
Loading…
Reference in New Issue
Block a user