-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
dev-libs/glib: backport gnome-keyring CPU peg fix
Bug: https://bugs.gentoo.org/878995 Bug: https://bugs.gentoo.org/878351 Signed-off-by: Sam James <sam@gentoo.org>
- Loading branch information
1 parent
9e0a6db
commit 92e1c53
Showing
2 changed files
with
419 additions
and
0 deletions.
There are no files selected for viewing
131 changes: 131 additions & 0 deletions
131
dev-libs/glib/files/glib-2.74.1-gnome-keyring-cpu.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,131 @@ | ||
https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3029 | ||
https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3039 (backport PR we've used) | ||
https://bugs.gentoo.org/878995 | ||
https://bugs.gentoo.org/878351 | ||
|
||
From e2f283d7c8c5ab3aeb2f281a27ec7c0f24b86868 Mon Sep 17 00:00:00 2001 | ||
From: Ray Strode <rstrode@redhat.com> | ||
Date: Fri, 28 Oct 2022 11:21:04 -0400 | ||
Subject: [PATCH 1/2] Revert "Handling collision between standard i/o file | ||
descriptors and newly created ones" | ||
|
||
g_unix_open_pipe tries to avoid the standard io fd range | ||
when getting pipe fds. This turns out to be a bad idea because | ||
certain buggy programs rely on it using that range. | ||
|
||
This reverts commit d9ba6150909818beb05573f54f26232063492c5b | ||
--- a/glib/glib-unix.c | ||
+++ b/glib/glib-unix.c | ||
@@ -108,17 +108,6 @@ 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 */ | ||
@@ -127,19 +116,6 @@ 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 | ||
From 4526620d8c485f5dfba6ddca33f91670982f82eb Mon Sep 17 00:00:00 2001 | ||
From: Ray Strode <rstrode@redhat.com> | ||
Date: Mon, 31 Oct 2022 09:17:55 -0400 | ||
Subject: [PATCH 2/2] glib-unix: Add test to make sure g_unix_open_pipe will | ||
intrude standard range | ||
|
||
Now that we know it's a bad idea to avoid the standard io fd range | ||
when getting pipe fds for g_unix_open_pipe, we should test to make sure | ||
we don't inadvertently try to do it again. | ||
|
||
This commit adds that test. | ||
--- a/glib/tests/unix.c | ||
+++ b/glib/tests/unix.c | ||
@@ -24,8 +24,11 @@ | ||
#include "config.h" | ||
|
||
#include "glib-unix.h" | ||
+#include "gstdio.h" | ||
+ | ||
#include <string.h> | ||
#include <pwd.h> | ||
+#include <unistd.h> | ||
|
||
static void | ||
test_pipe (void) | ||
@@ -52,6 +55,39 @@ test_pipe (void) | ||
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; | ||
+ | ||
+ 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 | ||
test_error (void) | ||
{ | ||
@@ -337,6 +373,7 @@ main (int argc, | ||
g_test_init (&argc, &argv, NULL); | ||
|
||
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/nonblocking", test_nonblocking); | ||
g_test_add_func ("/glib-unix/sighup", test_sighup); | ||
GitLab |
Oops, something went wrong.