Merge branch 'handling_collision_over_standard_file_descriptors' into 'main'

Handling collision between standard i/o file descriptors and newly created ones

Closes #16

See merge request GNOME/glib!2846
This commit is contained in:
Marco Trevisan 2022-09-19 14:35:45 +00:00
commit 7e9625a79b

View File

@ -108,6 +108,17 @@ 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 */
@ -116,6 +127,19 @@ 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;