app: Work around pkexec restriction when launching

Unless automatic child reaping is disabled in GSpawnFlags, glib's
g_spawn_* functions will reparent the spawned process to init by
double-forking. Unfortunately pkexec bails out in this case[0],
which means that it no longer works in .desktop files since the
PID tracking removal in commit 01c6392c13.
Fix this by going back to manual child reaping.

[0] https://cgit.freedesktop.org/polkit/tree/src/programs/pkexec.c#n728

https://bugzilla.gnome.org/show_bug.cgi?id=763531
This commit is contained in:
Florian Müllner 2017-03-25 02:46:25 +01:00
parent c9d5677c2f
commit 053b8da89c

View File

@ -1196,6 +1196,14 @@ app_child_setup (gpointer user_data)
} }
#endif #endif
static void
wait_pid (GDesktopAppInfo *appinfo,
GPid pid,
gpointer user_data)
{
g_child_watch_add (pid, (GChildWatchFunc) g_spawn_close_pid, NULL);
}
/** /**
* shell_app_launch: * shell_app_launch:
* @timestamp: Event timestamp, or 0 for current event timestamp * @timestamp: Event timestamp, or 0 for current event timestamp
@ -1234,13 +1242,13 @@ shell_app_launch (ShellApp *app,
ret = g_desktop_app_info_launch_uris_as_manager (app->info, NULL, ret = g_desktop_app_info_launch_uris_as_manager (app->info, NULL,
context, context,
G_SPAWN_SEARCH_PATH, G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
#ifdef HAVE_SYSTEMD #ifdef HAVE_SYSTEMD
app_child_setup, (gpointer)shell_app_get_id (app), app_child_setup, (gpointer)shell_app_get_id (app),
#else #else
NULL, NULL, NULL, NULL,
#endif #endif
NULL, NULL, wait_pid, NULL,
error); error);
g_object_unref (context); g_object_unref (context);