Y2038 BUG

Поиск
Список
Период
Сортировка
От Bryan Green
Тема Y2038 BUG
Дата
Msg-id bf960b48-d406-4356-9282-9c46a37151a4@gmail.com
обсуждение исходный текст
Ответы Re: Y2038 BUG
Список pgsql-hackers
Hello,

There is a Y2038 bug in win32gettimeofday.c due to long being 32-bits on
Windows and the use of struct timeval.

int
gettimeofday(struct timeval *tp, void *tzp)


struct timeval is defined in winsock2.h and is needed by the Windows
select() call. The 64-bit values have to be narrowed to 32-bit values
for the struct timeval slots.

tp->tv_sec = (long) ((ularge.QuadPart - epoch) / FILETIME_UNITS_PER_SEC);

tp->tv_usec = (long) (((ularge.QuadPart - epoch) %
FILETIME_UNITS_PER_SEC) / FILETIME_UNITS_PER_USEC);


I set my system clock to be in 2038 you can see the "wrap-around" error
in the following test.

C:\pg99>date 01-19-2038

C:\pg99>bin\psql -d postgres -p 5454 -c "SELECT clock_timestamp(),
extract(epoch from clock_timestamp()), timeofday();"
        clock_timestamp        |      extract       |              timeofday
-------------------------------+--------------------+-------------------------------------
 1901-12-13 18:46:42.483928-06 | -2147469197.516072 | Fri Dec 13
18:46:42.484319 1901 CST
(1 row)

I then set it to a date before 2038 but still in the future and it
worked as expected.

C:\pg99>date 05-19-2035

C:\pg99>bin\psql -d postgres -p 5454 -c "SELECT clock_timestamp(),
extract(epoch from clock_timestamp()), timeofday();"
        clock_timestamp        |      extract      |              timeofday
-------------------------------+-------------------+-------------------------------------
 2035-05-19 02:15:09.119002-05 | 2063171709.119002 | Sat May 19
02:15:09.119315 2035 CDT
(1 row)

The struct timeval is unguarded in winsock2.h are we could just use the
guard to define our own.

We can create our own pg_timeval with a few helper conversion functions.
 Obviously, there are a lot of places in the codebase where gettimeofday
is called.  My question is whether we want to fix this now or wait with
crossed fingers that Microsoft fixes this in a timely manner?

If we choose to create our own timeval struct, should we convert to
struct timespec instead?  If we want to move forward with either of
these for a Y2038 fix, I will be more than happy to create a patch for
whichever.

Bryan Green





В списке pgsql-hackers по дате отправления: