summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Persch <chpe@src.gnome.org>2022-04-22 17:59:18 +0200
committerChristian Persch <chpe@src.gnome.org>2022-04-22 17:59:18 +0200
commitc5359ce84438098c798953a1b03eeb1c24fb0bc5 (patch)
tree410278c8f84a8427b632958d002aa272b6d21cb0
parent3a3d84fd6c7c2c0ed937cd7cd2a7ae4eabc83060 (diff)
downloadgnome-terminal-c5359ce84438098c798953a1b03eeb1c24fb0bc5.tar.gz
client: Filter out other terminal's environment variables
-rw-r--r--src/terminal-client-utils.cc51
-rw-r--r--src/terminal-client-utils.hh2
-rw-r--r--src/terminal-screen.cc20
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 */