[mutter/wip/pwithnall/meta-xwayland-fd-leaks] xwayland: Fix some FD leaks on error paths
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/pwithnall/meta-xwayland-fd-leaks] xwayland: Fix some FD leaks on error paths
- Date: Wed, 24 Feb 2021 14:23:17 +0000 (UTC)
commit bec456ba0a3a9aa54c09052c0b1591b4b81e1ed5
Author: Philip Withnall <pwithnall endlessos org>
Date: Fri Feb 19 18:04:25 2021 +0000
xwayland: Fix some FD leaks on error paths
If `meta_xwayland_start_xserver()` returned via an error path, some of
the socket FDs were leaked.
Fix that, and add `steal_fd()` calls to make it clearer that FDs passed
to `g_subprocess_launcher_take_fd()` are transferred to it. There were
no bugs with how `GSubprocessLauncher` was being used.
Spotted while working on
https://gitlab.gnome.org/GNOME/glib/-/issues/2332.
Signed-off-by: Philip Withnall <pwithnall endlessos org>
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1738>
src/wayland/meta-xwayland.c | 29 ++++++++++++++++++++++++-----
1 file changed, 24 insertions(+), 5 deletions(-)
---
diff --git a/src/wayland/meta-xwayland.c b/src/wayland/meta-xwayland.c
index 7abcb5def2..48fabbfb33 100644
--- a/src/wayland/meta-xwayland.c
+++ b/src/wayland/meta-xwayland.c
@@ -837,6 +837,14 @@ on_displayfd_ready (int fd,
return G_SOURCE_REMOVE;
}
+static int
+steal_fd (int *fd_ptr)
+{
+ int fd = *fd_ptr;
+ *fd_ptr = -1;
+ return fd;
+}
+
void
meta_xwayland_start_xserver (MetaXWaylandManager *manager,
GCancellable *cancellable,
@@ -880,6 +888,9 @@ meta_xwayland_start_xserver (MetaXWaylandManager *manager,
if (socketpair (AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, displayfd) < 0)
{
+ close (xwayland_client_fd[0]);
+ close (xwayland_client_fd[1]);
+
g_task_return_new_error (task,
G_IO_ERROR,
g_io_error_from_errno (errno),
@@ -903,11 +914,16 @@ meta_xwayland_start_xserver (MetaXWaylandManager *manager,
launcher = g_subprocess_launcher_new (flags);
- g_subprocess_launcher_take_fd (launcher, xwayland_client_fd[1], 3);
- g_subprocess_launcher_take_fd (launcher, manager->public_connection.abstract_fd, 4);
- g_subprocess_launcher_take_fd (launcher, manager->public_connection.unix_fd, 5);
- g_subprocess_launcher_take_fd (launcher, displayfd[1], 6);
- g_subprocess_launcher_take_fd (launcher, manager->private_connection.abstract_fd, 7);
+ g_subprocess_launcher_take_fd (launcher,
+ steal_fd (&xwayland_client_fd[1]), 3);
+ g_subprocess_launcher_take_fd (launcher,
+ steal_fd (&manager->public_connection.abstract_fd), 4);
+ g_subprocess_launcher_take_fd (launcher,
+ steal_fd (&manager->public_connection.unix_fd), 5);
+ g_subprocess_launcher_take_fd (launcher,
+ steal_fd (&displayfd[1]), 6);
+ g_subprocess_launcher_take_fd (launcher,
+ steal_fd (&manager->private_connection.abstract_fd), 7);
g_subprocess_launcher_setenv (launcher, "WAYLAND_SOCKET", "3", TRUE);
@@ -954,6 +970,9 @@ meta_xwayland_start_xserver (MetaXWaylandManager *manager,
if (!manager->proc)
{
+ close (displayfd[0]);
+ close (xwayland_client_fd[0]);
+
g_task_return_error (task, error);
return;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]