From e49060c207fd201f71316bf174e1b467827abc7a Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Fri, 6 Sep 2019 16:52:15 -0600 Subject: [PATCH] lib/gpg: Use g_spawn_sync to kill gpg-agent For reasons I don't understand, GSubprocess doesn't play nice with KDE's plasmashell. I assume this has something to do with the GSubprocess using the glib worker thread while plasmashell uses the glib main loop. Instead, just use g_spawn_sync to fork and wait in the current thread. Fixes: #1913 Closes: #1917 Approved by: cgwalters --- src/libotutil/ot-gpg-utils.c | 53 ++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/src/libotutil/ot-gpg-utils.c b/src/libotutil/ot-gpg-utils.c index 97a1c756..743d941e 100644 --- a/src/libotutil/ot-gpg-utils.c +++ b/src/libotutil/ot-gpg-utils.c @@ -509,31 +509,32 @@ ot_gpgme_kill_agent (const char *homedir) } /* Run gpg-connect-agent killagent /bye */ - g_autoptr(GError) local_error = NULL; - GSubprocessFlags flags = G_SUBPROCESS_FLAGS_STDOUT_SILENCE | G_SUBPROCESS_FLAGS_STDERR_PIPE; - g_debug ("Killing gpg-agent in %s", homedir); - g_autoptr(GSubprocess) proc = g_subprocess_new (flags, - &local_error, - "gpg-connect-agent", - "--homedir", - homedir, - "killagent", - "/bye", - NULL); - if (proc == NULL) { - g_debug ("Spawning gpg-connect-agent failed: %s", local_error->message); - return; - } - if (!g_subprocess_wait_check (proc, NULL, &local_error)) { - /* Dump out stderr on failures */ - GInputStream *stderr_in = g_subprocess_get_stderr_pipe (proc); - g_autoptr(GOutputStream) stderr_out = - G_OUTPUT_STREAM (g_unix_output_stream_new (STDERR_FILENO, FALSE)); - g_output_stream_splice (stderr_out, stderr_in, G_OUTPUT_STREAM_SPLICE_NONE, - NULL, NULL); + g_autoptr(GPtrArray) argv = g_ptr_array_new (); + g_ptr_array_add (argv, "gpg-connect-agent"); + g_ptr_array_add (argv, "--homedir"); + g_ptr_array_add (argv, (gpointer)homedir); + g_ptr_array_add (argv, "killagent"); + g_ptr_array_add (argv, "/bye"); + g_ptr_array_add (argv, NULL); - g_debug ("Killing GPG agent with gpg-connect-agent failed: %s", - local_error->message); - return; - } + g_autoptr(GError) local_error = NULL; + GSpawnFlags flags = G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL; + gint proc_status = 0; + g_autofree gchar *proc_stderr = NULL; + g_debug ("Killing gpg-agent in %s", homedir); + if (!g_spawn_sync (NULL, (char **)argv->pdata, NULL, flags, NULL, NULL, + NULL, &proc_stderr, &proc_status, &local_error)) + { + g_debug ("Spawning gpg-connect-agent failed: %s", local_error->message); + return; + } + if (!g_spawn_check_exit_status (proc_status, &local_error)) + { + /* Dump out stderr on failures */ + g_printerr ("%s", proc_stderr); + + g_debug ("Killing GPG agent with gpg-connect-agent failed: %s", + local_error->message); + return; + } }