Submitted By: Armin K. Date: 2013-04-30 Initial Package Version: 4.10.0 Upstream Status: Fixed Upstream Origin: Upstream Description: Fixes crashes with GLib 2.36. --- a/xfce4-session/xfsm-startup.c 2012-04-28 22:43:27.000000000 +0200 +++ b/xfce4-session/xfsm-startup.c 2013-04-30 20:36:42.594627904 +0200 @@ -864,6 +864,7 @@ gint n; const gchar *current_directory; GPid pid; + GError *error = NULL; /* release any possible old resources related to a previous startup */ xfsm_properties_set_default_child_watch (properties); @@ -878,49 +879,34 @@ current_directory = xfsm_properties_get_string (properties, SmCurrentDirectory); - /* fork a new process for the application */ -#ifdef HAVE_VFORK - /* vfork() doesn't allow you to do anything but call exec*() or _exit(), - * so if we need to set the working directory, we can't use vfork() */ - if (current_directory == NULL) - pid = vfork (); - else -#endif - pid = fork (); - - /* handle the child process */ - if (pid == 0) + if (!g_spawn_async (current_directory, + argv, NULL, + G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH, + NULL, NULL, + &pid, &error)) { - /* execute the application here */ - if (current_directory) - { - if (chdir (current_directory)) - g_warning ("Unable to chdir to \"%s\": %s", current_directory, strerror (errno)); - } - execvp (argv[0], argv); - _exit (127); - } - - /* cleanup */ - g_strfreev (argv); + g_warning ("Unable to launch \"%s\": %s", + *argv, error->message); + g_error_free (error); + g_strfreev (argv); - /* check if we failed to fork */ - if (G_UNLIKELY (pid < 0)) - { - /* tell the user that we failed to fork */ - perror ("Failed to fork new process"); return FALSE; } + xfsm_verbose ("Launched command \"%s\" with PID %dn", *argv, (gint) pid); + + g_strfreev (argv); + properties->pid = pid; /* set a watch to make sure the child doesn't quit before registering */ - child_watch_data = g_new (XfsmStartupData, 1); + child_watch_data = g_new0 (XfsmStartupData, 1); child_watch_data->manager = g_object_ref (manager); child_watch_data->properties = properties; - g_child_watch_add_full (G_PRIORITY_LOW, properties->pid, - xfsm_startup_child_watch, child_watch_data, - (GDestroyNotify) xfsm_startup_data_free); + child_watch_data->properties->child_watch_id = + g_child_watch_add_full (G_PRIORITY_LOW, properties->pid, + xfsm_startup_child_watch, child_watch_data, + (GDestroyNotify) xfsm_startup_data_free); /* set a timeout -- client must register in a a certain amount of time * or it's assumed to be broken/have issues. */