diff --git a/bus/activation.c b/bus/activation.c index 05dbfce4..30950636 100644 --- a/bus/activation.c +++ b/bus/activation.c @@ -2301,6 +2301,7 @@ bus_activation_activate_service (BusActivation *activation, } dbus_free_string_array (argv); + dbus_free_string_array (envp); envp = NULL; _dbus_assert (pending_activation->babysitter != NULL); diff --git a/dbus/dbus-spawn-unix.c b/dbus/dbus-spawn-unix.c index b6a4acd5..742c3a7a 100644 --- a/dbus/dbus-spawn-unix.c +++ b/dbus/dbus-spawn-unix.c @@ -1269,7 +1269,7 @@ dbus_bool_t _dbus_spawn_async_with_babysitter (DBusBabysitter **sitter_p, const char *log_name, char * const *argv, - char **env, + char * const *env, DBusSpawnFlags flags, DBusSpawnChildSetupFunc child_setup, void *user_data, @@ -1513,8 +1513,6 @@ _dbus_spawn_async_with_babysitter (DBusBabysitter **sitter_p, else _dbus_babysitter_unref (sitter); - dbus_free_string_array (env); - _DBUS_ASSERT_ERROR_IS_CLEAR (error); return TRUE; diff --git a/dbus/dbus-spawn-win.c b/dbus/dbus-spawn-win.c index 5ad561c2..ca796055 100644 --- a/dbus/dbus-spawn-win.c +++ b/dbus/dbus-spawn-win.c @@ -61,15 +61,8 @@ struct DBusBabysitter { DBusAtomic refcount; - - HANDLE start_sync_event; - char *log_name; - int argc; - char **argv; - char **envp; - HANDLE thread_handle; HANDLE child_handle; DBusSocket socket_to_babysitter; /* Connection to the babysitter thread */ @@ -114,21 +107,10 @@ _dbus_babysitter_new (void) _dbus_babysitter_trace_ref (sitter, old_refcount, old_refcount+1, __FUNCTION__); - sitter->start_sync_event = CreateEvent (NULL, FALSE, FALSE, NULL); - if (sitter->start_sync_event == NULL) - { - _dbus_babysitter_unref (sitter); - return NULL; - } - sitter->child_handle = NULL; sitter->socket_to_babysitter = sitter->socket_to_main = _dbus_socket_get_invalid (); - sitter->argc = 0; - sitter->argv = NULL; - sitter->envp = NULL; - sitter->watches = _dbus_watch_list_new (); if (sitter->watches == NULL) { @@ -191,7 +173,6 @@ close_socket_to_babysitter (DBusBabysitter *sitter) void _dbus_babysitter_unref (DBusBabysitter *sitter) { - int i; dbus_int32_t old_refcount; PING(); @@ -211,29 +192,6 @@ _dbus_babysitter_unref (DBusBabysitter *sitter) sitter->socket_to_main.sock = INVALID_SOCKET; } - PING(); - if (sitter->argv != NULL) - { - for (i = 0; i < sitter->argc; i++) - if (sitter->argv[i] != NULL) - { - dbus_free (sitter->argv[i]); - sitter->argv[i] = NULL; - } - dbus_free (sitter->argv); - sitter->argv = NULL; - } - - if (sitter->envp != NULL) - { - char **e = sitter->envp; - - while (*e) - dbus_free (*e++); - dbus_free (sitter->envp); - sitter->envp = NULL; - } - if (sitter->child_handle != NULL) { CloseHandle (sitter->child_handle); @@ -250,13 +208,6 @@ _dbus_babysitter_unref (DBusBabysitter *sitter) if (sitter->watches) _dbus_watch_list_free (sitter->watches); - if (sitter->start_sync_event != NULL) - { - PING(); - CloseHandle (sitter->start_sync_event); - sitter->start_sync_event = NULL; - } - if (sitter->thread_handle) { CloseHandle (sitter->thread_handle); @@ -600,29 +551,8 @@ babysitter (void *parameter) { int ret = 0; DBusBabysitter *sitter = (DBusBabysitter *) parameter; - HANDLE handle; PING(); - _dbus_verbose ("babysitter: spawning %s\n", sitter->log_name); - - PING(); - handle = _dbus_spawn_program (sitter->log_name, sitter->argv, sitter->envp); - - PING(); - if (handle != INVALID_HANDLE_VALUE) - { - sitter->child_handle = handle; - } - else - { - sitter->child_handle = NULL; - sitter->have_spawn_errno = TRUE; - sitter->spawn_errno = GetLastError(); - } - - PING(); - SetEvent (sitter->start_sync_event); - if (sitter->child_handle != NULL) { DWORD status; @@ -655,7 +585,7 @@ dbus_bool_t _dbus_spawn_async_with_babysitter (DBusBabysitter **sitter_p, const char *log_name, char * const *argv, - char **envp, + char * const *envp, DBusSpawnFlags flags _DBUS_GNUC_UNUSED, DBusSpawnChildSetupFunc child_setup _DBUS_GNUC_UNUSED, void *user_data _DBUS_GNUC_UNUSED, @@ -663,7 +593,10 @@ _dbus_spawn_async_with_babysitter (DBusBabysitter **sitter_p, { DBusBabysitter *sitter; DWORD sitter_thread_id; - + HANDLE handle; + int argc; + char **my_argv = NULL; + _DBUS_ASSERT_ERROR_IS_CLEAR (error); _dbus_assert (argv[0] != NULL); @@ -723,13 +656,35 @@ _dbus_spawn_async_with_babysitter (DBusBabysitter **sitter_p, goto out0; } - sitter->argc = protect_argv (argv, &sitter->argv); - if (sitter->argc == -1) + argc = protect_argv (argv, &my_argv); + if (argc == -1) { _DBUS_SET_OOM (error); goto out0; } - sitter->envp = envp; + + _dbus_verbose ("babysitter: spawn child '%s'\n", my_argv[0]); + + PING(); + handle = _dbus_spawn_program (sitter->log_name, my_argv, (char **) envp); + + if (my_argv != NULL) + { + dbus_free_string_array (my_argv); + } + + PING(); + if (handle == INVALID_HANDLE_VALUE) + { + sitter->child_handle = NULL; + sitter->have_spawn_errno = TRUE; + sitter->spawn_errno = GetLastError(); + dbus_set_error_const (error, DBUS_ERROR_SPAWN_EXEC_FAILED, + "Failed to spawn child"); + goto out0; + } + + sitter->child_handle = handle; PING(); sitter->thread_handle = (HANDLE) CreateThread (NULL, 0, babysitter, @@ -743,9 +698,6 @@ _dbus_spawn_async_with_babysitter (DBusBabysitter **sitter_p, goto out0; } - PING(); - WaitForSingleObject (sitter->start_sync_event, INFINITE); - PING(); if (sitter_p != NULL) *sitter_p = sitter; diff --git a/dbus/dbus-spawn.h b/dbus/dbus-spawn.h index b36b1d86..03458d0a 100644 --- a/dbus/dbus-spawn.h +++ b/dbus/dbus-spawn.h @@ -47,7 +47,7 @@ typedef enum { dbus_bool_t _dbus_spawn_async_with_babysitter (DBusBabysitter **sitter_p, const char *log_name, char * const *argv, - char **env, + char * const *env, DBusSpawnFlags flags, DBusSpawnChildSetupFunc child_setup, void *user_data,