Add tests for '=' in names and values.
authorMatthias Clasen <maclas@gmx.de>
Thu, 7 Aug 2003 21:51:38 +0000 (21:51 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Thu, 7 Aug 2003 21:51:38 +0000 (21:51 +0000)
2003-08-07  Matthias Clasen  <maclas@gmx.de>

* tests/env-test.c: Add tests for '=' in names and values.

* glib/gutils.c (g_setenv, g_unsetenv): Check that the variable name doesn't contain '='. Add a
declaration for environ.  (#119338)

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
glib/gutils.c
tests/env-test.c

index 542f9ca..1f56433 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2003-08-07  Matthias Clasen  <maclas@gmx.de>
 
+       * tests/env-test.c: Add tests for '=' in names and values.
+
+       * glib/gutils.c (g_setenv, g_unsetenv): Check that the variable name doesn't contain '='. Add a
+       declaration for environ.  (#119338)
+
        * acinclude.m4: Tighten the snprintf() test to check behaviour on zero-size buffers.  (#106091)
 
        * tests/patterntest.c: Specify test strings in UTF-8, remove all charset conversion.
index 542f9ca..1f56433 100644 (file)
@@ -1,5 +1,10 @@
 2003-08-07  Matthias Clasen  <maclas@gmx.de>
 
+       * tests/env-test.c: Add tests for '=' in names and values.
+
+       * glib/gutils.c (g_setenv, g_unsetenv): Check that the variable name doesn't contain '='. Add a
+       declaration for environ.  (#119338)
+
        * acinclude.m4: Tighten the snprintf() test to check behaviour on zero-size buffers.  (#106091)
 
        * tests/patterntest.c: Specify test strings in UTF-8, remove all charset conversion.
index 542f9ca..1f56433 100644 (file)
@@ -1,5 +1,10 @@
 2003-08-07  Matthias Clasen  <maclas@gmx.de>
 
+       * tests/env-test.c: Add tests for '=' in names and values.
+
+       * glib/gutils.c (g_setenv, g_unsetenv): Check that the variable name doesn't contain '='. Add a
+       declaration for environ.  (#119338)
+
        * acinclude.m4: Tighten the snprintf() test to check behaviour on zero-size buffers.  (#106091)
 
        * tests/patterntest.c: Specify test strings in UTF-8, remove all charset conversion.
index 542f9ca..1f56433 100644 (file)
@@ -1,5 +1,10 @@
 2003-08-07  Matthias Clasen  <maclas@gmx.de>
 
+       * tests/env-test.c: Add tests for '=' in names and values.
+
+       * glib/gutils.c (g_setenv, g_unsetenv): Check that the variable name doesn't contain '='. Add a
+       declaration for environ.  (#119338)
+
        * acinclude.m4: Tighten the snprintf() test to check behaviour on zero-size buffers.  (#106091)
 
        * tests/patterntest.c: Specify test strings in UTF-8, remove all charset conversion.
index 542f9ca..1f56433 100644 (file)
@@ -1,5 +1,10 @@
 2003-08-07  Matthias Clasen  <maclas@gmx.de>
 
+       * tests/env-test.c: Add tests for '=' in names and values.
+
+       * glib/gutils.c (g_setenv, g_unsetenv): Check that the variable name doesn't contain '='. Add a
+       declaration for environ.  (#119338)
+
        * acinclude.m4: Tighten the snprintf() test to check behaviour on zero-size buffers.  (#106091)
 
        * tests/patterntest.c: Specify test strings in UTF-8, remove all charset conversion.
index 542f9ca..1f56433 100644 (file)
@@ -1,5 +1,10 @@
 2003-08-07  Matthias Clasen  <maclas@gmx.de>
 
+       * tests/env-test.c: Add tests for '=' in names and values.
+
+       * glib/gutils.c (g_setenv, g_unsetenv): Check that the variable name doesn't contain '='. Add a
+       declaration for environ.  (#119338)
+
        * acinclude.m4: Tighten the snprintf() test to check behaviour on zero-size buffers.  (#106091)
 
        * tests/patterntest.c: Specify test strings in UTF-8, remove all charset conversion.
index 1efd754..18ef828 100644 (file)
@@ -697,7 +697,7 @@ g_getenv (const gchar *variable)
 
 /**
  * g_setenv:
- * @variable: the environment variable to set.
+ * @variable: the environment variable to set, must not contain '='.
  * @value: the value for to set the variable to.
  * @overwrite: whether to change the variable if it already exists.
  *
@@ -716,6 +716,7 @@ g_setenv (const gchar *variable,
          gboolean     overwrite)
 {
   gint result;
+  g_return_val_if_fail (strchr (variable, '=') == NULL, FALSE);
 #ifdef HAVE_SETENV
   result = setenv (variable, value, overwrite);
 #else
@@ -733,10 +734,17 @@ g_setenv (const gchar *variable,
 #endif
   return result == 0;
 }
-                
+
+#ifndef HAVE_UNSETENV     
+/* According to the Single Unix Specification, environ is not in 
+ * any system header, although unistd.h often declares it.
+ */
+extern char **environ;
+#endif
+           
 /**
  * g_unsetenv:
- * @variable: the environment variable to remove.
+ * @variable: the environment variable to remove, must not contain '='.
  * 
  * Removes an environment variable from the environment.
  *
@@ -750,11 +758,15 @@ void
 g_unsetenv (const gchar *variable)
 {
 #ifdef HAVE_UNSETENV
+  g_return_if_fail (strchr (variable, '=') == NULL);
+
   unsetenv (variable);
 #else
   int i, len;
   gchar **e, **f;
+
+  g_return_if_fail (strchr (variable, '=') == NULL);
+
   len = strlen (variable);
   
   /* Mess directly with the environ array.
index 178cf76..2a343f2 100644 (file)
@@ -34,6 +34,7 @@
 #endif
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 
 #include <glib.h>
 #include <unistd.h>
 #endif
 
+static void 
+log (const gchar   *log_domain,
+     GLogLevelFlags log_level,
+     const gchar   *message,
+     gpointer       user_data)
+{
+  /* Silence g_assert () and friends.
+   */
+}
+
 int 
 main (int argc, char *argv[])
 {
@@ -51,6 +62,8 @@ main (int argc, char *argv[])
   gchar *value1 = "works";
   gchar *value2 = "again";
 
+  g_log_set_handler ("GLib", G_LOG_LEVEL_CRITICAL, log, NULL);
+
   data = g_getenv (variable);
   g_assert (data == NULL && "TEST_G_SETENV already set");
   
@@ -81,5 +94,22 @@ main (int argc, char *argv[])
   data = g_getenv (variable);
   g_assert (data == NULL && "g_unsetenv() doesn't work");
 
+  result = g_setenv ("foo=bar", "baz", TRUE);
+  g_assert (!result && "g_setenv() accepts '=' in names");
+
+  result = g_setenv ("foo", "bar=baz", TRUE);
+  g_assert (result && "g_setenv() doesn't accept '=' in values");
+  data = g_getenv ("foo=bar");
+  g_assert (strcmp (data, "baz") == 0 && "g_getenv() doesn't support '=' in names");
+  data = g_getenv ("foo");
+  g_assert (strcmp (data, "bar=baz") == 0 && "g_getenv() doesn't support '=' in values");
+  
+  g_unsetenv ("foo=bar");
+  data = g_getenv ("foo");
+  g_assert (data != NULL && "g_unsetenv() accepts '=' in names");
+  g_unsetenv ("foo");
+  data = g_getenv ("foo");
+  g_assert (data == NULL && "g_unsetenv() doesn't support '=' in values");
+
   return 0;
 }