Skip to content

Commit

Permalink
Avoid-double-forking-when-launching-apps-it-breaks
Browse files Browse the repository at this point in the history
  • Loading branch information
raveit committed Feb 5, 2013
1 parent 63af85a commit 2905402
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 10 deletions.
40 changes: 32 additions & 8 deletions mate-panel/libpanel-util/panel-launch.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,25 @@ _panel_launch_handle_error (const gchar *name,
return FALSE;
}

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 void
gather_pid_callback (GDesktopAppInfo *gapp,
GPid pid,
gpointer data)
{
g_child_watch_add (pid, dummy_child_watch, NULL);
}

gboolean
panel_app_info_launch_uris (GAppInfo *appinfo,
GList *uris,
Expand All @@ -86,7 +105,7 @@ panel_app_info_launch_uris (GAppInfo *appinfo,
GError *local_error;
gboolean retval;

g_return_val_if_fail (G_IS_APP_INFO (appinfo), FALSE);
g_return_val_if_fail (G_IS_DESKTOP_APP_INFO (appinfo), FALSE);
g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);

Expand All @@ -95,16 +114,18 @@ panel_app_info_launch_uris (GAppInfo *appinfo,
gdk_app_launch_context_set_timestamp (context, timestamp);

local_error = NULL;
retval = g_app_info_launch_uris (appinfo, uris,
(GAppLaunchContext *) context,
&local_error);
retval = g_desktop_app_info_launch_uris_as_manager ((GDesktopAppInfo*)appinfo, uris,
(GAppLaunchContext *) context,
G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
NULL, NULL, gather_pid_callback, appinfo,
&local_error);

g_object_unref (context);

if ((local_error == NULL) && (retval == TRUE))
return TRUE;

return _panel_launch_handle_error (g_app_info_get_name (appinfo),
return _panel_launch_handle_error (g_app_info_get_name ((GAppInfo*) appinfo),
screen, local_error, error);
}

Expand Down Expand Up @@ -209,6 +230,7 @@ panel_launch_desktop_file_with_fallback (const char *desktop_file,
char *argv[2] = { (char *) fallback_exec, NULL };
GError *local_error;
gboolean retval;
GPid pid;

g_return_val_if_fail (desktop_file != NULL, FALSE);
g_return_val_if_fail (fallback_exec != NULL, FALSE);
Expand All @@ -226,10 +248,12 @@ panel_launch_desktop_file_with_fallback (const char *desktop_file,
}

retval = gdk_spawn_on_screen (screen, NULL, argv, NULL,
G_SPAWN_SEARCH_PATH,
NULL, NULL, NULL, &local_error);
G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
NULL, NULL, &pid, &local_error);

if (local_error == NULL && retval == TRUE)
if (local_error == NULL && retval == TRUE) {
g_child_watch_add (pid, dummy_child_watch, NULL);
}
return TRUE;

return _panel_launch_handle_error (fallback_exec,
Expand Down
18 changes: 16 additions & 2 deletions mate-panel/panel-run-dialog.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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;
Expand All @@ -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) {
Expand All @@ -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);
Expand Down

0 comments on commit 2905402

Please sign in to comment.