mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-03 01:36:17 +01:00
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
This commit is contained in:
parent
985ffc3b4e
commit
d9ba615090
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user