A personal technical blog post documenting a debugging journey involving the Year 2038 problem, Steam, and fontconfig overflow. The author accidentally set system clock to 2040 to unlock a game achievement, causing file timestamps to overflow 32-bit systems. The post presents clear diagnosis and working solution through filesystem operations. The content has no substantive engagement with human rights principles.
Similarly I had a bug where KDE's
zip unpacker would extract empty(?) folders but interpret uninitialized memory as the folder date, creating folders with a modification time after 2038 that Wine couldn't open.
It seems odd that the problem is in the access time of the files - why does a font library (or, almost any program) care about the last read time of a file? Sure, the modification time is important, but it's pretty rare that code should care about when a file has been read before. The only program I have heard of that broke when access times are unreliable was mutt, the email client.
A long time ago, I was playing Far Cry. Console was opened. Then all of a sudden IRC chat messages from the IRC client I was running in the background would appear in-game, with fronts and effects (shadows) from the game. shrugs
Is Linux really not commonly using 64-bit file times yet? I know there are some years left, but it seems like a relatively straightforward problem that needs to be solved for everyone.
2038 is going to be an interesting year that’s for sure. I’m big into Final Fantasy VII modding/speedrunning and while reverse engineering the game I stumbled upon some code that actually checks if the current date is before 2038. If it’s not it refuses to run. I have no idea why they put this kind of check in the game's code, I tried to remove it but the game actually still didn’t start so there is probably some issue that prevents it from working when the date overflows.
I can only imagine that a lot of other legacy software will have similar issues when we reach year 2038.
When i first learned of the 2038 problem, i changed the date on my computer and watched it tick up to 2^32. All sorts of things crashed, most notably, the Norton antivirus software. This was on a windows XP if I recall correctly
Steam client fonts are a mess even without y2038 bugs. There's no good way to change size globally - despite the entire client being based on HTML/CSS tech! The current 'solution'* is to edit stylesheets manually as if it were a new skin, and find/modify every invocation of font-size.
* Or use Big Picture mode, which has other issues.
On an older Windows version, one day I lost internet connectivity on my machine and I didn't understand what had happened because the network interface was reporting that it was ok and the external connection appeared to be operating correctly.
Virus? Possible, but unlikely. A virus wants to spread, not limit its opportunities to do so.
After investigating, I was able to determine that the system clock somehow had gotten set past 2038 and this was sufficient to destroy network connectivity. As soon as it was corrected, everything was fine again.
Not the first time I have run into a clock issue breaking software.
We are lucky 2038 is still 16 years away and not next month.
It’s good this came up here. I just spent the last week or so going through the MaraDNS code base and fixing all of the little Y2038 issues.
I know, time_t is 64-bit with pretty much any new Linux distro out there, so why are people seeing Y2038 issues? It’s because the Windows 32-bit POSIX compatibility layer handles Y2038 very poorly. Once Y2038 is reached, the POSIX time() call in a 32-bit app fails with a -1. It doesn’t use a rolling timestamp somewhere in 1901 the way 32-bit Linux applications with 32-bit time_t do. It fails hard, returning -1 for every call to time().
Now, it’s true that Microsoft does have proprietary calls for time and date which are Y2038 compliant, and, yes, native Windows32 apps should use those calls instead of the POSIX ones, but in the real world, it’s sometimes a lot easier to, say, just use stat() to get a file’s timestamp instead of having to use CreateFile() followed by GetFileTime().
This is why a lot of Windows apps are still seeing Y2038 issues.
In terms of Linux apps, the Y2038 stuff is mainly seen in old 32-bit binary only apps. Since that stuff is mainly games, where an inaccurate datestamp isn’t a serious issue, I think we will see emulation libraries which give old games a synthetic time and date so they aren’t outside of the Y2038 window. New apps will use a 64-bit time_t even if compiled as a 32-bit binary.
For those of us that chuckle at it at this time, this is likely to be far far far bigger than Y2K. The reason is because software that runs critical aspects of human life will have proliferated to a greater degree when compared to >2000, and <2038.
Before 2000, we had software running our systems, yes. But it was not as distributed, and not as ubiquitous, and not as deeply ingrained into human culture as it is today. This proliferation will obviously continue past today, and while hardware and low-level OS/software mitigations (as well as a herculean effort to clean up the mess) will make up the gap, it's not hard to see that this is likely to be much more impactful upon failure because of the "embeddedness" of these systems.
A box that has just been doing its thing for 40-50-60 years and all of a sudden fails, is likely to be more impactful than one that was 20-30 years old even.
We had a computer dedicated to encoding video that had a misconfigured date that was in the future so all of the encodes from it had the incorrect date. It played havoc with another program on a different system with the correct date. It took a few days for that program's support team to recognize the issue. There was nothing wrong with the file as in the video/audio data was not corrupt or anything. Doing a stream copy to a new file with a sane date made the program happy again.
Never did understand why the software even looked at dates, and support couldn't explain it either.
> why does a font library (or, almost any program) care about the last read time of a file? Sure, the modification time is important, but it's pretty rare that code should care about when a file has been read before.
There's no separate system call for the modification time; a single system call (https://man7.org/linux/man-pages/man2/stat.2.html) returns the three times (atime, mtime, ctime) together. The font library probably wanted just the modification time (to check whether the font cache is stale), but it cannot get the mtime without also getting the atime (and ctime).
> Is Linux really not commonly using 64-bit file times yet?
It is, and that was the problem. The legacy 32-bit API the library loaded within Steam was using, or more precisely, the legacy 32-bit system call used by that library, could not represent the 64-bit time, so the kernel returned the EOVERFLOW (Value too large for defined data type) error. The root cause of the problem seems to be that Steam is still a 32-bit application (and hasn't been recompiled to used the Latest and Greatest version of glibc, which allows for 64-bit timestamps even on 32-bit processes).
If his Linux installation did not use 64-bit file times, the timestamp stored for the file would have fit in 32 bits, and the error wouldn't have happened (though other things would probably have broken first).
(Well, actually, Linux is using 34-bit file times, at least on ext4 and xfs, but that's a bit of a nitpicking: what matters is that it doesn't fit in 32 bits.)
> I stumbled upon some code that actually checks if the current date is before 2038. If it’s not it refuses to run. I have no idea why they put this kind of check in the game's code,
That's actually very clever. Instead of crashing in unexpected ways or doing odd things, just cleanly exit. If you really want it to run after 2038, you have to emulate the clock, which would then avoid these potential Y2038 bugs.
Interesting that Norton seems to use Unix timestamps. I’ve never developed for Windows, is it common for Windows devs to use them too? Or just some niche feature causing a more widespread problem?
fontconfig is the library responsible for indexing and looking up fonts (e.g. by name - note that most software doesn't specify fonts by file name but rather by font name)
If fontconfig fails to stat() a font file, it presumably aborts trying to record any information about that font file. Notably, it doesn't know what the font file's actual font name is. If all fonts fail due to stat(), no information will be available about any font. fontconfig has multiple levels of fallback (e.g. "similar" fonts first), but in this case since nothing is known about any font you just get whatever font happens to be first in the list of all fonts.
Oh man, this just unlocked a cool memory - I was in my computer graphics course in college and was trying to write a shader that would generate a wood-grain texture.
I messed something up about it, and must have been pulling from the wrong graphics memory, and noticed That the brown wood didn't have a swirl pattern but had what looked like text in it?
After staring a bit closer, I noticed it was the text that was written to the console in visual studio, I had somehow brought that graphics buffer in to use as my "swirl pattern". I had to sit back and think a bit about how data on your computer isn't always as safe as you think sometimes after that...
Y2038 programming is my retirement plan. I’ll be around 60 and probably kicked out of Silicon Valley employability due to ageism. Like the cobol programmers in the 90s, in 2038 they will be scrambling to find old farts who still know C and UNIX.
SSL certificates are only valid for a slim date range, setting your clock too far ahead or too far behind will result in invalid certificates throwing errors.
It will break earlier because unix time isn't only a display format. Tons of calculation are scheduling things into the future. But if the future ends up being in the past? Then you will have problem now. Starting from things with 10 year cycle, 5 year, yearly, monthly, daily. The more nearer to 2038, the more things explodes.
I had a similar issue. I've also had issues with dual boot to Linux. When logging back into Windows the clock is always wrong. I have to turn on and off the automatic date setting function to get it to refresh.
The Steam client is super old and crusty. Ubuntu tried to remove 32 bit libraries like Apple a while ago but Valve told them if they did that, Steam would no longer be supported so the plan was scrapped.
Editorial Channel
What the content says
ND
PreamblePreamble
No engagement with principles of equal/inalienable rights or human dignity.
ND
Article 1Freedom, Equality, Brotherhood
No discussion of equal dignity or inalienable rights.
ND
Article 2Non-Discrimination
No mention of discrimination or protected categories.
ND
Article 3Life, Liberty, Security
Discussion of Year 2038 problem is technical, not about rights to life or security.
ND
Article 4No Slavery
No discussion of slavery or servitude.
ND
Article 5No Torture
No discussion of torture or inhumane treatment.
ND
Article 6Legal Personhood
No discussion of personhood before law.
ND
Article 7Equality Before Law
No discussion of equality before law.
ND
Article 8Right to Remedy
No discussion of legal remedies.
ND
Article 9No Arbitrary Detention
No discussion of arbitrary arrest or detention.
ND
Article 10Fair Hearing
No discussion of fair trial or due process.
ND
Article 11Presumption of Innocence
No discussion of presumption of innocence.
ND
Article 12Privacy
No discussion of privacy or family.
ND
Article 13Freedom of Movement
No discussion of freedom of movement.
ND
Article 14Asylum
No discussion of asylum or refuge.
ND
Article 15Nationality
No discussion of nationality.
ND
Article 16Marriage & Family
No discussion of marriage or family.
ND
Article 17Property
No discussion of property ownership.
ND
Article 18Freedom of Thought
No discussion of freedom of thought, conscience, or religion.
ND
Article 19Freedom of Expression
Content supports information sharing via RSS and discussion platforms, but does not explicitly engage with freedom of opinion or expression as a human right.
ND
Article 20Assembly & Association
No discussion of freedom of assembly or association.
ND
Article 21Political Participation
No discussion of participation in government.
ND
Article 22Social Security
No discussion of social security or economic rights.
ND
Article 23Work & Equal Pay
References Steam in technical context only; no discussion of labor rights or fair wages.
ND
Article 24Rest & Leisure
Mentions gaming in technical debugging context, not as discussion of rights to rest or leisure.
ND
Article 25Standard of Living
No discussion of health or standard of living.
ND
Article 26Education
No discussion of education.
ND
Article 27Cultural Participation
Content discusses video games as technical artifacts but does not engage with rights to participate in cultural or scientific life. Author expresses appreciation ('incredibly funny game I highly recommend'), but narrative focuses on technical debugging.
ND
Article 28Social & International Order
No discussion of social/international order.
ND
Article 29Duties to Community
No discussion of community duties.
ND
Article 30No Destruction of Rights
No discussion of limitations on rights.
Structural Channel
What the site does
ND
PreamblePreamble
Blog structure does not address Preamble concepts.
ND
Article 1Freedom, Equality, Brotherhood
No structural engagement.
ND
Article 2Non-Discrimination
No structural engagement.
ND
Article 3Life, Liberty, Security
No structural engagement.
ND
Article 4No Slavery
No structural engagement.
ND
Article 5No Torture
No structural engagement.
ND
Article 6Legal Personhood
No structural engagement.
ND
Article 7Equality Before Law
No structural engagement.
ND
Article 8Right to Remedy
No structural engagement.
ND
Article 9No Arbitrary Detention
No structural engagement.
ND
Article 10Fair Hearing
No structural engagement.
ND
Article 11Presumption of Innocence
No structural engagement.
ND
Article 12Privacy
Blog avoids tracking, but this is incidental rather than explicit engagement with privacy rights.
ND
Article 13Freedom of Movement
No structural engagement.
ND
Article 14Asylum
No structural engagement.
ND
Article 15Nationality
No structural engagement.
ND
Article 16Marriage & Family
No structural engagement.
ND
Article 17Property
No structural engagement.
ND
Article 18Freedom of Thought
No structural engagement.
ND
Article 19Freedom of Expression
Blog structure supports open information dissemination without apparent censorship, but this is incidental to its function as a technical blog.
ND
Article 20Assembly & Association
No structural engagement.
ND
Article 21Political Participation
No structural engagement.
ND
Article 22Social Security
No structural engagement.
ND
Article 23Work & Equal Pay
No structural engagement.
ND
Article 24Rest & Leisure
No structural engagement.
ND
Article 25Standard of Living
No structural engagement.
ND
Article 26Education
No structural engagement.
ND
Article 27Cultural Participation
Blog shares technical and cultural content but does not structurally engage with Article 27 rights.
ND
Article 28Social & International Order
No structural engagement.
ND
Article 29Duties to Community
No structural engagement.
ND
Article 30No Destruction of Rights
No structural engagement.
Supplementary Signals
How this content communicates, beyond directional lean. Learn more
build b3ef88d+do1d · deployed 2026-02-28 14:37 UTC · evaluated 2026-02-28 14:28:40 UTC
Support HN HRCB
Each evaluation uses real API credits. HN HRCB runs on donations — no ads, no paywalls.
If you find it useful, please consider helping keep it running.