Projects
Factory:RISC-V:Gnome
glib2
_service:tar_scm:backport-Handling-collision-be...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:backport-Handling-collision-between-standard-i-o-file-descriptors-and-newly-created-ones.patch of Package glib2
From d9ba6150909818beb05573f54f26232063492c5b Mon Sep 17 00:00:00 2001 From: Emmanuel Fleury <emmanuel.fleury@gmail.com> Date: Mon, 1 Aug 2022 19:05:14 +0200 Subject: [PATCH] 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 Conflict:NA Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/d9ba6150909818beb05573f54f26232063492c5b --- glib/glib-unix.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/glib/glib-unix.c b/glib/glib-unix.c index d2dea10ef0..d67b8a357a 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; -- GitLab
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2