Thread: BUG #18585: Date/time conversion functions are not protected against integer overflow

The following bug has been logged on the website:

Bug reference:      18585
Logged by:          Alexander Lakhin
Email address:      exclusion@gmail.com
PostgreSQL version: 17beta3
Operating system:   Ubuntu 22.04
Description:

The date/time conversion functions do_to_timestamp(), DCH_from_char(),
... lack reliable checks for integer overflow in the input components.

1) Millennium:
SELECT to_timestamp('2147483647,999', 'Y,YYY');
       to_timestamp        
---------------------------
 0001-01-01 00:00:00+00 BC
vs
SELECT to_timestamp('2147483,999', 'Y,YYY');
ERROR:  timestamp out of range

2) Century:
SELECT to_date('-2147483648', 'CC');
  to_date   
------------
 0001-01-01
vs
SELECT to_date('-21474836', 'CC');
ERROR:  date out of range: "-21474836"

3) Century + year:
SELECT to_date('-2147483648 01', 'CC YY');
  to_date   
------------
 0100-01-01
vs
SELECT to_date('-21474836 01', 'CC YY');
ERROR:  date out of range: "-21474836 01"

4) Milliseconds:
SELECT to_timestamp('0.-2147483648', 'SS.MS');
       to_timestamp        
---------------------------
 0001-01-01 00:00:00+00 BC
vs
SELECT to_timestamp('0.-2147483', 'SS.MS');
ERROR:  date/time field value out of range: "0.-2147483"

5) Week of month:
SELECT to_timestamp('613566758', 'W');
       to_timestamp        
---------------------------
 0001-01-04 00:00:00+00 BC
vs
SELECT to_timestamp('613566750', 'W');
ERROR:  date/time field value out of range: "613566750"

6) Week number of year:
SELECT to_timestamp('2024 613566758 1', 'YYYY WW D');
      to_timestamp      
------------------------
 2024-01-04 00:00:00+00
vs
SELECT to_timestamp('2024 61356675 1', 'YYYY WW D');
ERROR:  date/time field value out of range: "2024 61356675 1"

7)  ISO Week:
SELECT to_date('2024 613566758 1', 'IYYY IW ID');
  to_date   
------------
 2024-01-04
vs
SELECT to_date('2024 61356675 1', 'IYYY IW ID');
    to_date    
---------------
 1177946-01-28

Observed on REL_12_STABLE .. master.

(A couple of such anomalies were noticed at
https://www.postgresql.org/message-id/31ad2cd1-db94-bdb3-f91a-65ffdb4bef95%40gmail.com,
but as these ones trigger an incorrect behaviour even without -ftrapv and
in the back branches, maybe it's better to fix these defects separately.)


PG Bug reporting form <noreply@postgresql.org> writes:
> The date/time conversion functions do_to_timestamp(), DCH_from_char(),
> ... lack reliable checks for integer overflow in the input components.

It's pretty hard to get excited about that, given that the overflow
limits are so many orders of magnitude beyond the useful input range.
There are plenty of garbage-in-garbage-out scenarios associated with
(mis)use of the to_xxx functions, and this feels like just another one.

If anybody does feel excited about the topic, I'm not going to stand
in their way ... but I'm not excited.

            regards, tom lane



PG Bug reporting form <noreply@postgresql.org> writes:
> The date/time conversion functions do_to_timestamp(), DCH_from_char(),
> ... lack reliable checks for integer overflow in the input components.
...
> (A couple of such anomalies were noticed at
> https://www.postgresql.org/message-id/31ad2cd1-db94-bdb3-f91a-65ffdb4bef95%40gmail.com,
> but as these ones trigger an incorrect behaviour even without -ftrapv and
> in the back branches, maybe it's better to fix these defects separately.)

The "v25-0001-Remove-dependence-on-fwrapv-semantics-in-some-da.patch"
patch in the linked thread above actually resolves some of these
issues. I took a brief look and it looks like most (possibly all) of
the remaining issues are due to unchecked arithmetic in the
`do_to_timestamp()` function in `formatting.c`. To resolve these issues
I would suggest someone go through that function and replace any
arithmetic that might overflow with the overflow-aware routines in
`int.h`. There are plenty of examples already in the
`do_to_timestamp()` function.

On Sun, Aug 18, 2024 at 12:53 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
>
> If anybody does feel excited about the topic, I'm not going to stand
> in their way ... but I'm not excited.

I similarly do not plan on working on this but wanted to post the above
information for anyone who is interested.

Thanks,
Joseph Koshakow