Re: pg_ctl/miscinit: print "MyStartTime" as a long long instead of long to avoid 2038 problem.
Nathan Bossart <nathandbossart@gmail.com>
From: Nathan Bossart <nathandbossart@gmail.com>
To: Max Johnson <max.johnson@novatechautomation.com>
Cc: "pgsql-hackers@postgresql.org" <pgsql-hackers@postgresql.org>
Date: 2024-09-24T20:26:47Z
Lists: pgsql-hackers
On Tue, Sep 24, 2024 at 07:33:24PM +0000, Max Johnson wrote:
> I have found an instance of a time overflow with the start time that is
> written in "postmaster.pid". On a 32-bit Linux system, if the system date
> is past 01/19/2038, when you start Postgres with `pg_ctl start -D
> {datadir} ...`, the start time will have rolled back to approximately
> 1900. This is an instance of the "2038 problem". On my system, pg_ctl
> will not exit if the start time has overflowed.
Nice find. I think this has been the case since the start time was added
to the lock files [0].
> - snprintf(buffer, sizeof(buffer), "%d\n%s\n%ld\n%d\n%s\n",
> + snprintf(buffer, sizeof(buffer), "%d\n%s\n%lld\n%d\n%s\n",
> amPostmaster ? (int) my_pid : -((int) my_pid),
> DataDir,
> - (long) MyStartTime,
> + (long long) MyStartTime,
> PostPortNumber,
> socketDir);
I think we should use INT64_FORMAT here. That'll choose the right length
modifier for the platform. And I don't think we need to cast MyStartTime,
since it's a pg_time_t (which is just an int64).
[0] https://postgr.es/c/30aeda4
--
nathan
Commits
-
Add INT64_HEX_FORMAT and UINT64_HEX_FORMAT to c.h.
- efdc7d747539 18.0 landed
-
Fix Y2038 issues with MyStartTime.
- c91d0af0a2ad 12.21 landed
- b255493aefe9 13.17 landed
- a356d23fd3ad 17.1 landed
- 8aaf88b63de3 16.5 landed
- 5d6187d2a283 18.0 landed
- 5cea7168dfe6 14.14 landed
- 01731eeeaa96 15.9 landed