]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Avoid dereferencing an undefined pointer in DecodeInterval().
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 12 Feb 2023 17:50:55 +0000 (12:50 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 12 Feb 2023 17:50:55 +0000 (12:50 -0500)
Commit e39f99046 moved some code up closer to the start of
DecodeInterval(), without noticing that it had been implicitly
relying on previous checks to reject the case of empty input.
Given empty input, we'd now dereference a pointer that hadn't been
set, possibly leading to a core dump.  (But if we fail to provoke
a SIGSEGV, nothing bad happens, and the expected syntax error is
thrown a bit later.)

Per bug #17788 from Alexander Lakhin.  Back-patch to v15 where
the fault was introduced.

Discussion: https://postgr.es/m/17788-dabac9f98f7eafd5@postgresql.org

src/backend/utils/adt/datetime.c
src/test/regress/expected/interval.out
src/test/regress/sql/interval.sql

index a3cfd54409b77805812716ab8e125009da7bd7a7..cebc11727449f8b35abc269bc07f49fe622c76e0 100644 (file)
@@ -3365,7 +3365,7 @@ DecodeInterval(char **field, int *ftype, int nf, int range,
         * to dump in postgres style, not SQL style.)
         *----------
         */
-       if (IntervalStyle == INTSTYLE_SQL_STANDARD && *field[0] == '-')
+       if (IntervalStyle == INTSTYLE_SQL_STANDARD && nf > 0 && *field[0] == '-')
        {
                force_negative = true;
                /* Check for additional explicit signs */
index 00885acd1df3ff3fa11a986dcf324d6a1c84b8be..78c1fab2b6389dfdc0385747f4515554472b5466 100644 (file)
@@ -857,6 +857,11 @@ SELECT  interval '-23 hours 45 min 12.34 sec',
  -23:45:12.34 | -1 23:45:12.34 | -1-2 -1 -23:45:12.34 | -0-10 +1 +23:45:12.34
 (1 row)
 
+-- edge case for sign-matching rules
+SELECT  interval '';  -- error
+ERROR:  invalid input syntax for type interval: ""
+LINE 1: SELECT  interval '';
+                         ^
 -- test outputting iso8601 intervals
 SET IntervalStyle to iso_8601;
 select  interval '0'                                AS "zero",
index 97d33a13236a662a42139cd2955fdcf35e9847ed..55a449b6179d651bb3a7d48d22d480d024ac1f9b 100644 (file)
@@ -277,6 +277,9 @@ SELECT  interval '-23 hours 45 min 12.34 sec',
         interval '-1 year 2 months 1 day 23 hours 45 min 12.34 sec',
         interval '-1 year 2 months 1 day 23 hours 45 min +12.34 sec';
 
+-- edge case for sign-matching rules
+SELECT  interval '';  -- error
+
 -- test outputting iso8601 intervals
 SET IntervalStyle to iso_8601;
 select  interval '0'                                AS "zero",