Blob Blame History Raw
From b72f69c0d45947e703543c5ff039a36d3edf5e84 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Tue, 26 Mar 2019 11:03:00 -0400
Subject: [PATCH] gsm-util: avoid groups in regexex

They can lead to stack overflows if pcre isn't built with --disable-stack-for-recursion
---
 gnome-session/gsm-util.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/gnome-session/gsm-util.c b/gnome-session/gsm-util.c
index acb446a3..be971fe1 100644
--- a/gnome-session/gsm-util.c
+++ b/gnome-session/gsm-util.c
@@ -490,61 +490,61 @@ gsm_util_update_activation_environment (const char  *variable,
         g_clear_object (&connection);
 
         return environment_updated;
 }
 
 gboolean
 gsm_util_export_activation_environment (GError     **error)
 {
 
         GDBusConnection *connection;
         gboolean         environment_updated = FALSE;
         char           **entry_names;
         int              i = 0;
         GVariantBuilder  builder;
         GRegex          *name_regex, *value_regex;
         GVariant        *reply;
         GError          *bus_error = NULL;
 
         connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, error);
 
         if (connection == NULL) {
                 return FALSE;
         }
 
         name_regex = g_regex_new ("^[a-zA-Z_][a-zA-Z0-9_]*$", G_REGEX_OPTIMIZE, 0, error);
 
         if (name_regex == NULL) {
                 return FALSE;
         }
 
-        value_regex = g_regex_new ("^([[:blank:]]|[^[:cntrl:]])*$", G_REGEX_OPTIMIZE, 0, error);
+        value_regex = g_regex_new ("^[[:blank:][:^cntrl:]]*$", G_REGEX_OPTIMIZE, 0, error);
 
         if (value_regex == NULL) {
                 return FALSE;
         }
 
         g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{ss}"));
         for (entry_names = g_listenv (); entry_names[i] != NULL; i++) {
                 const char *entry_name = entry_names[i];
                 const char *entry_value = g_getenv (entry_name);
 
                 if (!g_utf8_validate (entry_name, -1, NULL))
                     continue;
 
                 if (!g_regex_match (name_regex, entry_name, 0, NULL))
                     continue;
 
                 if (!g_utf8_validate (entry_value, -1, NULL))
                     continue;
 
                 if (!g_regex_match (value_regex, entry_value, 0, NULL))
                     continue;
 
                 g_variant_builder_add (&builder, "{ss}", entry_name, entry_value);
         }
         g_regex_unref (name_regex);
         g_regex_unref (value_regex);
 
         g_strfreev (entry_names);
 
         reply = g_dbus_connection_call_sync (connection,
@@ -563,61 +563,61 @@ gsm_util_export_activation_environment (GError     **error)
         } else {
                 environment_updated = TRUE;
                 g_variant_unref (reply);
         }
 
         g_clear_object (&connection);
 
         return environment_updated;
 }
 
 #ifdef HAVE_SYSTEMD
 gboolean
 gsm_util_export_user_environment (GError     **error)
 {
 
         GDBusConnection *connection;
         gboolean         environment_updated = FALSE;
         char           **entries;
         int              i = 0;
         GVariantBuilder  builder;
         GRegex          *regex;
         GVariant        *reply;
         GError          *bus_error = NULL;
 
         connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, error);
 
         if (connection == NULL) {
                 return FALSE;
         }
 
-        regex = g_regex_new ("^[a-zA-Z_][a-zA-Z0-9_]*=([[:blank:]]|[^[:cntrl:]])*$", G_REGEX_OPTIMIZE, 0, error);
+        regex = g_regex_new ("^[a-zA-Z_][a-zA-Z0-9_]*=[[:blank:][:^cntrl:]]*$", G_REGEX_OPTIMIZE, 0, error);
 
         if (regex == NULL) {
                 return FALSE;
         }
 
         g_variant_builder_init (&builder, G_VARIANT_TYPE ("as"));
         for (entries = g_get_environ (); entries[i] != NULL; i++) {
                 const char *entry = entries[i];
 
                 if (!g_utf8_validate (entry, -1, NULL))
                     continue;
 
                 if (!g_regex_match (regex, entry, 0, NULL))
                     continue;
 
                 g_variant_builder_add (&builder, "s", entry);
         }
         g_regex_unref (regex);
 
         g_strfreev (entries);
 
         reply = g_dbus_connection_call_sync (connection,
                                              "org.freedesktop.systemd1",
                                              "/org/freedesktop/systemd1",
                                              "org.freedesktop.systemd1.Manager",
                                              "SetEnvironment",
                                              g_variant_new ("(@as)",
                                                             g_variant_builder_end (&builder)),
                                              NULL,
                                              G_DBUS_CALL_FLAGS_NONE,
-- 
2.20.1