]> granicus.if.org Git - postgresql/commitdiff
Fix overflow check in tm2timestamp (this time for sure).
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 4 Mar 2013 20:13:31 +0000 (15:13 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 4 Mar 2013 20:14:28 +0000 (15:14 -0500)
I fixed this code back in commit 841b4a2d5, but didn't think carefully
enough about the behavior near zero, which meant it improperly rejected
1999-12-31 24:00:00.  Per report from Magnus Hagander.

src/backend/utils/adt/timestamp.c
src/interfaces/ecpg/pgtypeslib/timestamp.c

index f4687d4ea9c90620cac88a195f6be460d3c50ed5..fdd0cf4393d5dd075cb848f736498211633c9935 100644 (file)
@@ -1559,8 +1559,9 @@ tm2timestamp(struct pg_tm * tm, fsec_t fsec, int *tzp, Timestamp *result)
                return -1;
        }
        /* check for just-barely overflow (okay except time-of-day wraps) */
-       if ((*result < 0 && date >= 0) ||
-               (*result >= 0 && date < 0))
+       /* caution: we want to allow 1999-12-31 24:00:00 */
+       if ((*result < 0 && date > 0) ||
+               (*result > 0 && date < -1))
        {
                *result = 0;                    /* keep compiler quiet */
                return -1;
index 22e3ce7273e5ffb429cf7728282402c5bf00bf86..f50feaf9cfa5707fe88da0b1f1513b069244b199 100644 (file)
@@ -76,8 +76,9 @@ tm2timestamp(struct tm * tm, fsec_t fsec, int *tzp, timestamp * result)
        if ((*result - time) / USECS_PER_DAY != dDate)
                return -1;
        /* check for just-barely overflow (okay except time-of-day wraps) */
-       if ((*result < 0 && dDate >= 0) ||
-               (*result >= 0 && dDate < 0))
+       /* caution: we want to allow 1999-12-31 24:00:00 */
+       if ((*result < 0 && dDate > 0) ||
+               (*result > 0 && dDate < -1))
                return -1;
 #else
        *result = dDate * SECS_PER_DAY + time;