changeset 15841:80a852988718

(set_time_zone_rule): Don't put a string literal "TZ=..." in environ.
author Richard M. Stallman <rms@gnu.org>
date Thu, 08 Aug 1996 20:04:18 +0000
parents 1d300843f03c
children e8d7059aadc3
files src/editfns.c
diffstat 1 files changed, 15 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/editfns.c	Thu Aug 08 20:00:16 1996 +0000
+++ b/src/editfns.c	Thu Aug 08 20:04:18 1996 +0000
@@ -936,6 +936,17 @@
   return Qnil;
 }
 
+/* These two values are known to load tz files in buggy implementations.
+   Their values shouldn't matter in non-buggy implementations.
+   We don't use string literals for these strings, 
+   since if a string in the environment is in readonly
+   storage, it runs afoul of bugs in SVR4 and Solaris 2.3.
+   See Sun bugs 1113095 and 1114114, ``Timezone routines
+   improperly modify environment''.  */
+
+static char set_time_zone_rule_tz1[] = "TZ=GMT0";
+static char set_time_zone_rule_tz2[] = "TZ=GMT1";
+
 /* Set the local time zone rule to TZSTRING.
    This allocates memory into `environ', which it is the caller's
    responsibility to free.  */
@@ -986,17 +997,13 @@
        not load a tz file, tzset can dump core (see Sun bug#1225179).
        The following code works around these bugs.  */
 
-    /* These two values are known to load tz files in buggy implementations.
-       Their values shouldn't matter in non-buggy implementations.  */
-    char *tz1 = "TZ=GMT0";
-    char *tz2 = "TZ=GMT1";
-
     if (tzstring)
       {
 	/* Temporarily set TZ to a value that loads a tz file
 	   and that differs from tzstring.  */
 	char *tz = *newenv;
-	*newenv = strcmp (tzstring, tz1 + 3) == 0 ? tz2 : tz1;
+	*newenv = (strcmp (tzstring, set_time_zone_rule_tz1 + 3) == 0
+		   ? set_time_zone_rule_tz2 : set_time_zone_rule_tz1);
 	tzset ();
 	*newenv = tz;
       }
@@ -1004,10 +1011,10 @@
       {
 	/* The implied tzstring is unknown, so temporarily set TZ to
 	   two different values that each load a tz file.  */
-	*to = tz1;
+	*to = set_time_zone_rule_tz1;
 	to[1] = 0;
 	tzset ();
-	*to = tz2;
+	*to = set_time_zone_rule_tz2;
 	tzset ();
 	*to = 0;
       }