diff options
Diffstat (limited to 'libmate-desktop/mate-desktop-item.c')
-rw-r--r-- | libmate-desktop/mate-desktop-item.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/libmate-desktop/mate-desktop-item.c b/libmate-desktop/mate-desktop-item.c index eb004d9..c0ee1da 100644 --- a/libmate-desktop/mate-desktop-item.c +++ b/libmate-desktop/mate-desktop-item.c @@ -1721,6 +1721,17 @@ make_environment_for_screen (GdkScreen *screen, return retval; } +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 int ditem_execute (const MateDesktopItem *item, const char *exec, @@ -1749,6 +1760,7 @@ ditem_execute (const MateDesktopItem *item, char *new_exec, *uris, *temp; char *exec_locale; int launched = 0; + GPid pid; #ifdef HAVE_STARTUP_NOTIFICATION GdkDisplay *gdkdisplay; SnLauncherContext *sn_context; @@ -1957,14 +1969,17 @@ ditem_execute (const MateDesktopItem *item, (do_not_reap_child ? G_SPAWN_DO_NOT_REAP_CHILD : 0) | G_SPAWN_SEARCH_PATH /* flags */, NULL, /* child_setup_func */ NULL, /* child_setup_func_data */ - &ret /* child_pid */, + (do_not_reap_child ? &pid : NULL) /* child_pid */, error)) { /* The error was set for us, * we just can't launch this thingie */ ret = -1; g_strfreev (real_argv); break; + } else if (do_not_reap_child) { + g_child_watch_add (pid, dummy_child_watch, NULL); } + launched ++; g_strfreev (real_argv); |