From 69682e2f775cba346b2481aab3e98206d9f654eea1830a0bf8d2b4712151f54a Mon Sep 17 00:00:00 2001 From: Bruce Rogers Date: Wed, 11 Dec 2019 18:51:38 +0000 Subject: [PATCH] Accepting request 755915 from home:bfrogers:branches:Virtualization Fix boo#1157235 OBS-URL: https://build.opensuse.org/request/show/755915 OBS-URL: https://build.opensuse.org/package/show/Virtualization/spice-vdagent?expand=0&rev=28 --- spice-vdagent.changes | 6 ++ spice-vdagent.spec | 6 +- ...ession-lookup-for-new-GNOME-versions.patch | 100 ++++++++++++++++++ 3 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 vdagentd-Fix-session-lookup-for-new-GNOME-versions.patch diff --git a/spice-vdagent.changes b/spice-vdagent.changes index 3ea0eba..d4c0959 100644 --- a/spice-vdagent.changes +++ b/spice-vdagent.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Wed Dec 11 17:33:36 UTC 2019 - Bruce Rogers + +- Add upstream fix for spice-vdagent running on recent GNOME (eg. + 3.34) with systemd integration (boo#1157235) + ------------------------------------------------------------------- Fri May 17 20:34:45 UTC 2019 - Bruce Rogers diff --git a/spice-vdagent.spec b/spice-vdagent.spec index fafd558..63173fb 100644 --- a/spice-vdagent.spec +++ b/spice-vdagent.spec @@ -1,7 +1,7 @@ # # spec file for package spice-vdagent # -# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2019 SUSE LLC # Copyright (c) 2014 B1 Systems GmbH, Vohburg, Germany. # # All modifications and additions to the file contributed by third parties @@ -23,11 +23,12 @@ Release: 0 Summary: Agent for Spice guests License: GPL-3.0-or-later Group: System/Daemons -Url: http://spice-space.org/ +URL: http://spice-space.org/ Source: http://spice-space.org/download/releases/%{name}-%{version}.tar.bz2 Source1: http://spice-space.org/download/releases/%{name}-%{version}.tar.bz2.sig Source2: %{name}.keyring Patch0: spice-vdagent-var_run.patch +Patch1: vdagentd-Fix-session-lookup-for-new-GNOME-versions.patch BuildRequires: alsa-devel >= 1.0.22 BuildRequires: desktop-file-utils BuildRequires: glib2-devel @@ -61,6 +62,7 @@ Features: %prep %setup -q %patch0 -p1 +%patch1 -p1 %build %configure \ diff --git a/vdagentd-Fix-session-lookup-for-new-GNOME-versions.patch b/vdagentd-Fix-session-lookup-for-new-GNOME-versions.patch new file mode 100644 index 0000000..7b1e603 --- /dev/null +++ b/vdagentd-Fix-session-lookup-for-new-GNOME-versions.patch @@ -0,0 +1,100 @@ +From b67ff71f1b30992f5b8d4583cc93adb789d247fa Mon Sep 17 00:00:00 2001 +From: Benjamin Berg +Date: Fri, 13 Sep 2019 17:00:27 +0200 +Subject: [PATCH] vdagentd: Fix session lookup for new GNOME versions + +New GNOME versions have started to manage the session using the systemd +user instance. The effect of this is that the spice-vdagent running in +the user session is forked off (indirectly) from the systemd user +instance and does technically not belong to any session. + +The correct way of handling this situation is to simply assume that the +process belongs to the users graphical session. Add a heuristic to find +the graphical session based on the UID, fixing spice-vdagent running on +GNOME 3.34 with systemd integration. + +Acked-by: Victor Toso +[BR: boo#1157235] +Signed-off-by: Bruce Rogers +--- + src/vdagentd/systemd-login.c | 59 +++++++++++++++++++++++++++++++++--- + 1 file changed, 55 insertions(+), 4 deletions(-) + +diff --git a/src/vdagentd/systemd-login.c b/src/vdagentd/systemd-login.c +index a11b66d..0b8f3c1 100644 +--- a/src/vdagentd/systemd-login.c ++++ b/src/vdagentd/systemd-login.c +@@ -286,15 +286,66 @@ const char *session_info_get_active_session(struct session_info *si) + + char *session_info_session_for_pid(struct session_info *si, uint32_t pid) + { ++ int i; + int r; ++ GStrv sessions = NULL; + char *session = NULL; ++ uid_t uid; + + r = sd_pid_get_session(pid, &session); +- if (r < 0) +- syslog(LOG_ERR, "Error getting session for pid %u: %s", +- pid, strerror(-r)); +- else if (si->verbose) ++ if (r >= 0) { ++ goto out; ++ } ++ ++ /* If we could not get a session for the pid then the agent is probably ++ * running in a systemd managed session. In that case we simply assume ++ * it is actually part of the newest graphical session we can find. */ ++ r = sd_pid_get_owner_uid(pid, &uid); ++ if (r < 0) { ++ syslog(LOG_ERR, "Error getting owner UID for pid %u: %s", ++ pid, strerror(-r)); ++ goto out; ++ } ++ ++ r = sd_uid_get_sessions(uid, 0, &sessions); ++ if (r < 0) { ++ syslog(LOG_ERR, "Error getting sessions for UID %d: %s", ++ (int) uid, strerror(-r)); ++ goto out; ++ } ++ ++ for (i = 0; sessions[i] != NULL; i++) { ++ char *session_type = NULL; ++ ++ r = sd_session_get_type(sessions[i], &session_type); ++ ++ if (r < 0) { ++ syslog(LOG_ERR, "Error getting session type for session %s: %s", ++ sessions[i], strerror(-r)); ++ continue; ++ } ++ ++ if (g_strcmp0(session_type, "wayland") == 0 || ++ g_strcmp0(session_type, "x11") == 0 || ++ g_strcmp0(session_type, "mir") == 0) { ++ ++ /* We prefer the newest session (i.e. last entry) from the ++ * user, assuming that any old session that still exist has ++ * just not yet died properly. */ ++ if (session != NULL) ++ free (session); ++ session = g_strdup(sessions[i]); ++ } ++ ++ free(session_type); ++ } ++ ++ g_strfreev(sessions); ++ ++out: ++ if (session != NULL && si->verbose) { + syslog(LOG_INFO, "Session for pid %u: %s", pid, session); ++ } + + return session; + } +-- +2.24.0 +