mirror of
https://github.com/postgres/postgres.git
synced 2025-08-09 17:03:00 +03:00
Fix pg_tzset() to ensure that 'lclmem' (the static variable holding
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.
This commit is contained in:
@@ -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;
|
||||
|
||||
|
Reference in New Issue
Block a user