summaryrefslogtreecommitdiff
path: root/mate-panel/panel-run-dialog.c
diff options
context:
space:
mode:
authorraveit <[email protected]>2013-02-05 10:54:42 +0100
committerraveit <[email protected]>2013-02-05 10:54:42 +0100
commit2905402c0b856eaf86e497c41bbe0d630647c6f6 (patch)
treeccba619e5dc068eff770cd352339a81fcf54bd22 /mate-panel/panel-run-dialog.c
parent63af85af7ae234463478fa512939dec1a49f8b98 (diff)
downloadmate-panel-2905402c0b856eaf86e497c41bbe0d630647c6f6.tar.bz2
mate-panel-2905402c0b856eaf86e497c41bbe0d630647c6f6.tar.xz
Avoid-double-forking-when-launching-apps-it-breaks
Diffstat (limited to 'mate-panel/panel-run-dialog.c')
-rw-r--r--mate-panel/panel-run-dialog.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/mate-panel/panel-run-dialog.c b/mate-panel/panel-run-dialog.c
index f476b5de..339240d2 100644
--- a/mate-panel/panel-run-dialog.c
+++ b/mate-panel/panel-run-dialog.c
@@ -349,6 +349,17 @@ command_is_executable (const char *command,
return TRUE;
}
+static void
+dummy_child_watch (GPid pid,
+ gint status,
+ gpointer user_data)
+{
+ /* Nothing, this is just to ensure we don't double fork
+ * and break pkexec:
+ * https://bugzilla.gnome.org/show_bug.cgi?id=675789
+ */
+}
+
static gboolean
panel_run_dialog_launch_command (PanelRunDialog *dialog,
const char *command,
@@ -359,6 +370,7 @@ panel_run_dialog_launch_command (PanelRunDialog *dialog,
GError *error = NULL;
char **argv;
int argc;
+ GPid pid;
if (!command_is_executable (locale_command, &argc, &argv))
return FALSE;
@@ -372,10 +384,10 @@ panel_run_dialog_launch_command (PanelRunDialog *dialog,
NULL, /* working directory */
argv,
NULL, /* envp */
- G_SPAWN_SEARCH_PATH,
+ G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
NULL, /* child setup func */
NULL, /* user data */
- NULL, /* child pid */
+ &pid, /* child pid */
&error);
if (!result) {
@@ -389,6 +401,8 @@ panel_run_dialog_launch_command (PanelRunDialog *dialog,
g_free (primary);
g_error_free (error);
+ } else {
+ g_child_watch_add (pid, dummy_child_watch, NULL);
}
g_strfreev (argv);