Fix overflow hazards in interval input and output conversions

Enterprise / PostgreSQL - Tom Lane [] - 2 April 2022 20:12 UTC

DecodeInterval (interval input) was careless about integer-overflow hazards, allowing bogus results to be obtained for sufficiently large input values. Also, since it initially converted the input to a "struct tm", it was impossible to produce the full range of representable interval values.

Meanwhile, EncodeInterval (interval output) and a few other functions could suffer failures if asked to process sufficiently large interval values, because they also relied on being able to represent an interval in "struct tm" which is not designed to handle that.

Fix all this stuff by introducing new struct types that are more fit for purpose.

While this is clearly a bug fix, it's also an API break for any code that's calling these functions directly. So back-patching doesn't seem wise, especially in view of the lack of field complaints.

Joe Koshakow, editorialized a bit by me


e39f990467 Fix overflow hazards in interval input and output conversions.
src/backend/utils/adt/datetime.c | 734 +++++++++++++++++++++------------
src/backend/utils/adt/formatting.c | 86 +++-
src/backend/utils/adt/timestamp.c | 177 ++++----
src/include/datatype/timestamp.h | 39 ++
src/include/pgtime.h | 3 +
src/include/utils/datetime.h | 6 +-
src/include/utils/timestamp.h | 5 +-
src/test/regress/expected/interval.out | 611 +++++++++++++++++++++++++++
src/test/regress/sql/interval.sql | 184 +++++++++
9 files changed, 1473 insertions(+), 372 deletions(-)


  • Share