diff options
author | Christian Persch <chpe@src.gnome.org> | 2022-04-22 17:59:18 +0200 |
---|---|---|
committer | Christian Persch <chpe@src.gnome.org> | 2022-04-22 17:59:18 +0200 |
commit | c5359ce84438098c798953a1b03eeb1c24fb0bc5 (patch) | |
tree | 410278c8f84a8427b632958d002aa272b6d21cb0 | |
parent | 3a3d84fd6c7c2c0ed937cd7cd2a7ae4eabc83060 (diff) | |
download | gnome-terminal-c5359ce84438098c798953a1b03eeb1c24fb0bc5.tar.gz |
client: Filter out other terminal's environment variables
-rw-r--r-- | src/terminal-client-utils.cc | 51 | ||||
-rw-r--r-- | src/terminal-client-utils.hh | 2 | ||||
-rw-r--r-- | src/terminal-screen.cc | 20 |
3 files changed, 70 insertions, 3 deletions
diff --git a/src/terminal-client-utils.cc b/src/terminal-client-utils.cc index 1b1e2917..acd1719f 100644 --- a/src/terminal-client-utils.cc +++ b/src/terminal-client-utils.cc @@ -140,6 +140,49 @@ terminal_client_get_environment_filters (void) return filters; } +char const* const* +terminal_client_get_environment_prefix_filters (void) +{ + static char const* filters[] = { + "GNOME_TERMINAL_", + + /* other terminals */ + "FOOT_", + "ITERM2_", + "MC_", + "MINTTY_", + "PUTTY_", + "RXVT_", + "TERM_", + "URXVT_", + "WEZTERM_", + "XTERM_", + nullptr + }; + + return filters; +} + +static char** +terminal_environ_unsetenv_prefix (char** envv, + char const* prefix) +{ + if (!envv) + return envv; + + for (auto i = 0; envv[i]; ++i) { + if (!g_str_has_prefix (envv[i], prefix)) + continue; + + auto const equal = strchr(envv[i], '='); + g_assert(equal != nullptr); + gs_free char* env = g_strndup(envv[i], equal - envv[i]); + envv = g_environ_unsetenv (envv, env); + } + + return envv; +} + /** * terminal_client_filter_environment: * @envv: (transfer full): the environment @@ -154,10 +197,14 @@ terminal_client_filter_environment (char** envv) if (envv == nullptr) return nullptr; - char const* const* filters = terminal_client_get_environment_filters (); - for (unsigned i = 0; filters[i]; ++i) + auto filters = terminal_client_get_environment_filters (); + for (auto i = 0; filters[i]; ++i) envv = g_environ_unsetenv (envv, filters[i]); + filters = terminal_client_get_environment_prefix_filters (); + for (auto i = 0; filters[i]; ++i) + envv = terminal_environ_unsetenv_prefix (envv, filters[i]); + return envv; } diff --git a/src/terminal-client-utils.hh b/src/terminal-client-utils.hh index 0e1c14c5..88a6fd56 100644 --- a/src/terminal-client-utils.hh +++ b/src/terminal-client-utils.hh @@ -51,6 +51,8 @@ char * terminal_client_get_fallback_startup_id (void) G_GNUC_MALLOC; char const* const* terminal_client_get_environment_filters (void); +char const* const* terminal_client_get_environment_prefix_filters (void); + char** terminal_client_filter_environment (char** envv) G_GNUC_MALLOC; GSettings* terminal_g_settings_new (GSettingsSchemaSource* source, diff --git a/src/terminal-screen.cc b/src/terminal-screen.cc index dafdc71b..7c739d25 100644 --- a/src/terminal-screen.cc +++ b/src/terminal-screen.cc @@ -1404,6 +1404,17 @@ terminal_screen_get_child_command (TerminalScreen *screen, return TRUE; } +static gboolean +remove_prefixed_cb(void* key, + void* value, + void* user_data) +{ + auto const env = reinterpret_cast<char const*>(key); + auto const prefix = reinterpret_cast<char const*>(user_data); + + return g_str_has_prefix(env, prefix); +} + static char** terminal_screen_get_child_environment (TerminalScreen *screen, char **initial_envv, @@ -1439,10 +1450,17 @@ terminal_screen_get_child_environment (TerminalScreen *screen, } /* Remove unwanted env variables */ - char const* const* filters = terminal_client_get_environment_filters (); + auto const filters = terminal_client_get_environment_filters (); for (i = 0; filters[i]; ++i) g_hash_table_remove (env_table, filters[i]); + auto const pfilters = terminal_client_get_environment_filters (); + for (i = 0; pfilters[i]; ++i) { + g_hash_table_foreach_remove (env_table, + GHRFunc(remove_prefixed_cb), + (void*)pfilters[i]); + } + terminal_util_add_proxy_env (env_table); /* Add gnome-terminal private env vars used to communicate back to g-t-server */ |