]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix pg_tzset() to ensure that 'lclmem' (the static variable holding
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 10 Jan 2006 20:16:25 +0000 (20:16 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 10 Jan 2006 20:16:25 +0000 (20:16 +0000)
the localtime timezone data) is not overwritten until we know the data
is good.  tzload() is capable of failing after having begun modifying
the struct it's pointed at, and in such cases the static data was left
in a corrupt state.  Bug does not exist pre-8.0 (since we didn't have
this code then) nor post-8.0 (since we already changed the code to
tzload into local variables initially).  Per report from Nick Martens.

src/timezone/localtime.c

index 8e64f065b451982c224ce31ddf76ec49f9cdf566..64ed06185f0b65c337ac6be7f1df4f7b7c5ba802 100644 (file)
@@ -3,7 +3,7 @@
  * 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov).
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/timezone/localtime.c,v 1.9 2004/11/01 21:34:44 tgl Exp $
+ *       $PostgreSQL: pgsql/src/timezone/localtime.c,v 1.9.4.1 2006/01/10 20:16:25 tgl Exp $
  */
 
 /*
@@ -842,21 +842,24 @@ gmtload(struct state * sp)
 bool
 pg_tzset(const char *name)
 {
+       struct state tmpmem;
+
        if (lcl_is_set && strcmp(lcl_TZname, name) == 0)
                return true;                    /* no change */
 
        if (strlen(name) >= sizeof(lcl_TZname))
                return false;                   /* not gonna fit */
 
-       if (tzload(name, lclptr) != 0)
+       if (tzload(name, &tmpmem) != 0)
        {
-               if (name[0] == ':' || tzparse(name, lclptr, FALSE) != 0)
+               if (name[0] == ':' || tzparse(name, &tmpmem, FALSE) != 0)
                {
                        /* Unknown timezone. Fail our call instead of loading GMT! */
                        return false;
                }
        }
 
+       memcpy(lclptr, &tmpmem, sizeof(struct state));
        strcpy(lcl_TZname, name);
        lcl_is_set = true;