diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2023-02-20 17:26:25 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2023-02-20 17:26:25 -0500 |
commit | 8028e294b456bf1539649527fd98b3985fa4752a (patch) | |
tree | b8ee94bc94356202971ab0cb86f7edcba5ac2f56 /src/backend/utils/adt/timestamp.c | |
parent | f0d0394e84ceeda6f22eb3fdb89bd8adbfc13985 (diff) | |
download | postgresql-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.c | 5 |
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; |