aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/timestamp.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2023-02-20 17:26:25 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2023-02-20 17:26:25 -0500
commit8028e294b456bf1539649527fd98b3985fa4752a (patch)
treeb8ee94bc94356202971ab0cb86f7edcba5ac2f56 /src/backend/utils/adt/timestamp.c
parentf0d0394e84ceeda6f22eb3fdb89bd8adbfc13985 (diff)
downloadpostgresql-8028e294b456bf1539649527fd98b3985fa4752a.tar.gz
postgresql-8028e294b456bf1539649527fd98b3985fa4752a.zip
Detect overflow in timestamp[tz] subtraction.
It's possible to overflow the int64 microseconds field of the output interval when subtracting two timestamps. Detect that instead of silently returning a bogus result. Nick Babadzhanian Discussion: https://postgr.es/m/CABw73Uq2oJ3E+kYvvDuY04EkhhkChim2e-PaghBDjOmgUAMWGw@mail.gmail.com
Diffstat (limited to 'src/backend/utils/adt/timestamp.c')
-rw-r--r--src/backend/utils/adt/timestamp.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c
index 47e059a409b..de93db89d48 100644
--- a/src/backend/utils/adt/timestamp.c
+++ b/src/backend/utils/adt/timestamp.c
@@ -2713,7 +2713,10 @@ timestamp_mi(PG_FUNCTION_ARGS)
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
errmsg("cannot subtract infinite timestamps")));
- result->time = dt1 - dt2;
+ if (unlikely(pg_sub_s64_overflow(dt1, dt2, &result->time)))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
result->month = 0;
result->day = 0;