summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2013-03-04 20:13:31 +0000
committerTom Lane2013-03-04 20:14:28 +0000
commitcf678140548b0f0fdef36f314bb84e07e15b8c16 (patch)
tree6458464478f930c7ec44238cbd08229e819645ad
parente851b1f1b91f82df3662e93be8d9da0909385cd6 (diff)
Fix overflow check in tm2timestamp (this time for sure).
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.
-rw-r--r--src/backend/utils/adt/timestamp.c5
-rw-r--r--src/interfaces/ecpg/pgtypeslib/timestamp.c5
2 files changed, 6 insertions, 4 deletions
diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c
index f4687d4ea9c..fdd0cf4393d 100644
--- a/src/backend/utils/adt/timestamp.c
+++ b/src/backend/utils/adt/timestamp.c
@@ -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;
diff --git a/src/interfaces/ecpg/pgtypeslib/timestamp.c b/src/interfaces/ecpg/pgtypeslib/timestamp.c
index 22e3ce7273e..f50feaf9cfa 100644
--- a/src/interfaces/ecpg/pgtypeslib/timestamp.c
+++ b/src/interfaces/ecpg/pgtypeslib/timestamp.c
@@ -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;