[gnome-terminal] client: Filter out other terminal's environment variables



commit c5359ce84438098c798953a1b03eeb1c24fb0bc5
Author: Christian Persch <chpe src gnome org>
Date:   Fri Apr 22 17:59:18 2022 +0200

    client: Filter out other terminal's environment variables

 src/terminal-client-utils.cc | 51 ++++++++++++++++++++++++++++++++++++++++++--
 src/terminal-client-utils.hh |  2 ++
 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 */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]