From 88032367a960c96989a964006d28aa2f6851e4a8 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 20 Dec 2018 15:27:03 +0000 Subject: [PATCH] dbus-spawn: Don't take ownership of envp It's unexpected for a function to take ownership of its arguments without indicating that in its name, or at least documenting it. The only caller with envp != NULL is in bus_activation_activate_service(), which has been updated. Based on part of a larger commit by Ralf Habacker. Signed-off-by: Simon McVittie --- bus/activation.c | 1 + dbus/dbus-spawn-unix.c | 4 +--- dbus/dbus-spawn-win.c | 18 +++--------------- dbus/dbus-spawn.h | 2 +- 4 files changed, 6 insertions(+), 19 deletions(-) diff --git a/bus/activation.c b/bus/activation.c index 05dbfce46..309506364 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 b6a4acd53..742c3a7af 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 c4b356c59..ee03102f1 100644 --- a/dbus/dbus-spawn-win.c +++ b/dbus/dbus-spawn-win.c @@ -68,7 +68,6 @@ struct DBusBabysitter int argc; char **argv; - char **envp; HANDLE thread_handle; HANDLE child_handle; @@ -127,7 +126,6 @@ _dbus_babysitter_new (void) sitter->argc = 0; sitter->argv = NULL; - sitter->envp = NULL; sitter->watches = _dbus_watch_list_new (); if (sitter->watches == NULL) @@ -224,16 +222,6 @@ _dbus_babysitter_unref (DBusBabysitter *sitter) 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); @@ -636,7 +624,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, @@ -711,13 +699,13 @@ _dbus_spawn_async_with_babysitter (DBusBabysitter **sitter_p, _DBUS_SET_OOM (error); goto out0; } - sitter->envp = envp; PING(); _dbus_verbose ("babysitter: spawn child '%s'\n", sitter->argv[0]); PING(); - handle = _dbus_spawn_program (sitter->log_name, sitter->argv, sitter->envp); + handle = _dbus_spawn_program (sitter->log_name, sitter->argv, + (char **) envp); PING(); if (handle != INVALID_HANDLE_VALUE) diff --git a/dbus/dbus-spawn.h b/dbus/dbus-spawn.h index b36b1d86f..03458d0a5 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, -- 2.47.3