]> granicus.if.org Git - postgresql/commitdiff
Reject out-of-range numeric timezone specifications.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 22 Jul 2014 02:41:30 +0000 (22:41 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 22 Jul 2014 02:41:30 +0000 (22:41 -0400)
In commit 631dc390f49909a5c8ebd6002cfb2bcee5415a9d, we started to handle
simple numeric timezone offsets via the zic library instead of the old
CTimeZone/HasCTZSet kluge.  However, we overlooked the fact that the zic
code will reject UTC offsets exceeding a week (which seems a bit arbitrary,
but not because it's too tight ...).  This led to possibly setting
session_timezone to NULL, which results in crashes in most timezone-related
operations as of 9.4, and crashes in a small number of places even before
that.  So check for NULL return from pg_tzset_offset() and report an
appropriate error message.  Per bug #11014 from Duncan Gillis.

Back-patch to all supported branches, like the previous patch.
(Unfortunately, as of today that no longer includes 8.4.)

src/backend/commands/variable.c
src/timezone/pgtz.c

index e6d65c175d6ec9a6aa6e674d0ebbf121e64fda61..64fbf28a1e1d41a8f10715480ee8e6e7dd612fff 100644 (file)
@@ -372,6 +372,13 @@ check_timezone(char **newval, void **extra, GucSource source)
                }
        }
 
+       /* Test for failure in pg_tzset_offset, which we assume is out-of-range */
+       if (!myextra.session_timezone)
+       {
+               GUC_check_errdetail("UTC timezone offset is out of range.");
+               return false;
+       }
+
        /*
         * Prepare the canonical string to return.  GUC wants it malloc'd.
         *
index c673f1aa10fe76a6d8d8ef52b8e431da093b5279..581e27bba316c9881b7d3e485c5e5b8306dd0340 100644 (file)
@@ -296,6 +296,9 @@ pg_tzset(const char *name)
  * The GMT offset is specified in seconds, positive values meaning west of
  * Greenwich (ie, POSIX not ISO sign convention).  However, we use ISO
  * sign convention in the displayable abbreviation for the zone.
+ *
+ * Caution: this can fail (return NULL) if the specified offset is outside
+ * the range allowed by the zic library.
  */
 pg_tz *
 pg_tzset_offset(long gmtoffset)