0.00 Investigating why Steam started picking a random font (blog.pkh.meS:ND)
794 points by rbanffy 1196 days ago | 166 comments on HN | Neutral Editorial · v3.7 · 2026-02-28 12:28:54
Summary Technical Debugging Neutral
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.
Article Heatmap
Preamble: ND — Preamble Preamble: No Data — Preamble P Article 1: ND — Freedom, Equality, Brotherhood Article 1: No Data — Freedom, Equality, Brotherhood 1 Article 2: ND — Non-Discrimination Article 2: No Data — Non-Discrimination 2 Article 3: ND — Life, Liberty, Security Article 3: No Data — Life, Liberty, Security 3 Article 4: ND — No Slavery Article 4: No Data — No Slavery 4 Article 5: ND — No Torture Article 5: No Data — No Torture 5 Article 6: ND — Legal Personhood Article 6: No Data — Legal Personhood 6 Article 7: ND — Equality Before Law Article 7: No Data — Equality Before Law 7 Article 8: ND — Right to Remedy Article 8: No Data — Right to Remedy 8 Article 9: ND — No Arbitrary Detention Article 9: No Data — No Arbitrary Detention 9 Article 10: ND — Fair Hearing Article 10: No Data — Fair Hearing 10 Article 11: ND — Presumption of Innocence Article 11: No Data — Presumption of Innocence 11 Article 12: ND — Privacy Article 12: No Data — Privacy 12 Article 13: ND — Freedom of Movement Article 13: No Data — Freedom of Movement 13 Article 14: ND — Asylum Article 14: No Data — Asylum 14 Article 15: ND — Nationality Article 15: No Data — Nationality 15 Article 16: ND — Marriage & Family Article 16: No Data — Marriage & Family 16 Article 17: ND — Property Article 17: No Data — Property 17 Article 18: ND — Freedom of Thought Article 18: No Data — Freedom of Thought 18 Article 19: ND — Freedom of Expression Article 19: No Data — Freedom of Expression 19 Article 20: ND — Assembly & Association Article 20: No Data — Assembly & Association 20 Article 21: ND — Political Participation Article 21: No Data — Political Participation 21 Article 22: ND — Social Security Article 22: No Data — Social Security 22 Article 23: ND — Work & Equal Pay Article 23: No Data — Work & Equal Pay 23 Article 24: ND — Rest & Leisure Article 24: No Data — Rest & Leisure 24 Article 25: ND — Standard of Living Article 25: No Data — Standard of Living 25 Article 26: ND — Education Article 26: No Data — Education 26 Article 27: ND — Cultural Participation Article 27: No Data — Cultural Participation 27 Article 28: ND — Social & International Order Article 28: No Data — Social & International Order 28 Article 29: ND — Duties to Community Article 29: No Data — Duties to Community 29 Article 30: ND — No Destruction of Rights Article 30: No Data — No Destruction of Rights 30
Negative Neutral Positive No Data
Aggregates
Editorial Mean ND Structural Mean ND
Weighted Mean 0.00 Unweighted Mean 0.00
Max 0.00 N/A Min 0.00 N/A
Signal 0 No Data 31
Confidence 0% Volatility 0.00 (Low)
Negative 0 Channels E: 0.6 S: 0.4
SETL ND
Evidence: High: 0 Medium: 0 Low: 0 No Data: 31
Theme Radar
Foundation Security Legal Privacy & Movement Personal Expression Economic & Social Cultural Order & Duties Foundation: 0.00 (0 articles) Security: 0.00 (0 articles) Legal: 0.00 (0 articles) Privacy & Movement: 0.00 (0 articles) Personal: 0.00 (0 articles) Expression: 0.00 (0 articles) Economic & Social: 0.00 (0 articles) Cultural: 0.00 (0 articles) Order & Duties: 0.00 (0 articles)
HN Discussion 20 top-level · 30 replies
CaliforniaKarl 2022-11-19 19:46 UTC link
Holy heck I love that. Try to cheese a Stanley Parable achievement, and one dependency deep down inside Steam breaks.
develatio 2022-11-19 19:59 UTC link
> 2038 is going to be a lot of fun

Indeed it will be!

Twirrim 2022-11-19 20:01 UTC link
Shades of the fun yet to come, I guess. I don't _see_ any issue against it in their repo? https://gitlab.freedesktop.org/fontconfig/fontconfig/-/issue..., but trying to search for that can be tricky.
nickphx 2022-11-19 20:14 UTC link
I've used https://github.com/gibbed/SteamAchievementManager. To unlock game achievements on steam.
thesnide 2022-11-19 20:17 UTC link
Nice.

Spoiler ahead: But I'd use faketime in userspace to avoid messing up the system ;)

shadowgovt 2022-11-19 20:23 UTC link
(me before opening the link) "... on Linux."

click

"Hm, yes."

nyanpasu64 2022-11-19 20:50 UTC link
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.
joosters 2022-11-19 21:01 UTC link
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.
notafraudster 2022-11-19 21:05 UTC link
Cheating to get the Stanley Parable achievement devalues the hard work that all the rest of us did to earn it.
johnchristopher 2022-11-19 21:13 UTC link
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
TillE 2022-11-19 21:15 UTC link
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.
M4v3R 2022-11-19 21:31 UTC link
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.

hoppla 2022-11-19 21:37 UTC link
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
wentin 2022-11-19 21:42 UTC link
This is catching a bug early. Eventually this will happen to all gamers of steam when the year 2038 comes. Hopefully developers can fix it before then
yyyk 2022-11-19 22:33 UTC link
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.

butterNaN 2022-11-19 23:03 UTC link
The post doesn't solve the mystry for me - Why did 32 bit time cause in Steam picking that specific font?
Sunspark 2022-11-19 23:49 UTC link
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.

rcthompson 2022-11-20 01:24 UTC link
How long until a game adds a Steam achievement for opening the game after the 2k38 overflow date?
strenholme 2022-11-20 03:46 UTC link
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.

snoshy 2022-11-20 07:02 UTC link
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.

gary_0 2022-11-19 20:13 UTC link
We're gonna party like it's 1999!
hoosieree 2022-11-19 21:07 UTC link
Oh jeez, it's going to be so much worse than y2k.
dylan604 2022-11-19 21:16 UTC link
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.

cesarb 2022-11-19 21:18 UTC link
> 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).

cesarb 2022-11-19 21:27 UTC link
> 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.)

Edit: it seems that it's actually glibc that's returning the error, not the kernel, see https://news.ycombinator.com/item?id=33675526

labster 2022-11-19 21:28 UTC link
Username checks out.
CodesInChaos 2022-11-19 21:28 UTC link
At least we won't have to suffer though the 2106 problem.
MichaelZuo 2022-11-19 21:30 UTC link
Maybe no one understands how computers really work.
js8 2022-11-19 21:31 UTC link
Better play it today, because after 2028, you're never getting the achievement.
kevin_thibedeau 2022-11-19 21:38 UTC link
NTP epoch in 2036 is going to be better since it isn't getting any attention and there's going to be no shortage of broken IoT devices that fail.
the_af 2022-11-19 21:41 UTC link
This is a corner case which could have just as well occurred on Windows (or a similar kind of bug), though. It's not the expected usage.
cesarb 2022-11-19 21:46 UTC link
> 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.

mrighele 2022-11-19 22:12 UTC link
On the other side this post reminded me that is has been several years since I last played it, so I will check if I am eligible for the achievement.
cpeterso 2022-11-19 22:46 UTC link
Sounds like a graphics driver bug, as if it was reusing some GPU textures in both applications.
MrLeap 2022-11-19 22:58 UTC link
Is this in the ps1 version, the pc port, or are we talking the remake or something else?
DoughnutHole 2022-11-19 23:18 UTC link
Sounds like a great way to finally disable Norton if it's found a way onto your system.
jw1224 2022-11-19 23:26 UTC link
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?
eqvinox 2022-11-19 23:30 UTC link
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.

daguava 2022-11-19 23:30 UTC link
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...

houstonn 2022-11-20 00:09 UTC link
How will this stack up compared to the Year 2000 bug? Better? Worse?
donio 2022-11-20 00:12 UTC link
And don't even need to run Steam under it, just put it in the "Launch Options" field of the game.
Andrex 2022-11-20 00:28 UTC link
> 2038 is... 16 years away

Thanks for throwing me into an existential crisis... /s

ryandrake 2022-11-20 00:52 UTC link
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.
branon 2022-11-20 01:48 UTC link
Very useful tool, I have used a rewrite/spiritual successor: https://github.com/PaulCombal/SamRewritten
jazzyjackson 2022-11-20 03:02 UTC link
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.
wbobeirne 2022-11-20 03:20 UTC link
I wonder if there was some kind of local port re-use for an in game chat system? Maybe they built it off of some common IRC implementation?
mmis1000 2022-11-20 03:48 UTC link
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.
serf 2022-11-20 04:03 UTC link
why?

genuine question -- no snark intended. Is there some benefit other than completion?

another_story 2022-11-20 05:04 UTC link
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.
Gigachad 2022-11-20 06:46 UTC link
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
Preamble Preamble

No engagement with principles of equal/inalienable rights or human dignity.

ND
Article 1 Freedom, Equality, Brotherhood

No discussion of equal dignity or inalienable rights.

ND
Article 2 Non-Discrimination

No mention of discrimination or protected categories.

ND
Article 3 Life, Liberty, Security

Discussion of Year 2038 problem is technical, not about rights to life or security.

ND
Article 4 No Slavery

No discussion of slavery or servitude.

ND
Article 5 No Torture

No discussion of torture or inhumane treatment.

ND
Article 6 Legal Personhood

No discussion of personhood before law.

ND
Article 7 Equality Before Law

No discussion of equality before law.

ND
Article 8 Right to Remedy

No discussion of legal remedies.

ND
Article 9 No Arbitrary Detention

No discussion of arbitrary arrest or detention.

ND
Article 10 Fair Hearing

No discussion of fair trial or due process.

ND
Article 11 Presumption of Innocence

No discussion of presumption of innocence.

ND
Article 12 Privacy

No discussion of privacy or family.

ND
Article 13 Freedom of Movement

No discussion of freedom of movement.

ND
Article 14 Asylum

No discussion of asylum or refuge.

ND
Article 15 Nationality

No discussion of nationality.

ND
Article 16 Marriage & Family

No discussion of marriage or family.

ND
Article 17 Property

No discussion of property ownership.

ND
Article 18 Freedom of Thought

No discussion of freedom of thought, conscience, or religion.

ND
Article 19 Freedom 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 20 Assembly & Association

No discussion of freedom of assembly or association.

ND
Article 21 Political Participation

No discussion of participation in government.

ND
Article 22 Social Security

No discussion of social security or economic rights.

ND
Article 23 Work & Equal Pay

References Steam in technical context only; no discussion of labor rights or fair wages.

ND
Article 24 Rest & Leisure

Mentions gaming in technical debugging context, not as discussion of rights to rest or leisure.

ND
Article 25 Standard of Living

No discussion of health or standard of living.

ND
Article 26 Education

No discussion of education.

ND
Article 27 Cultural 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 28 Social & International Order

No discussion of social/international order.

ND
Article 29 Duties to Community

No discussion of community duties.

ND
Article 30 No Destruction of Rights

No discussion of limitations on rights.

Structural Channel
What the site does
ND
Preamble Preamble

Blog structure does not address Preamble concepts.

ND
Article 1 Freedom, Equality, Brotherhood

No structural engagement.

ND
Article 2 Non-Discrimination

No structural engagement.

ND
Article 3 Life, Liberty, Security

No structural engagement.

ND
Article 4 No Slavery

No structural engagement.

ND
Article 5 No Torture

No structural engagement.

ND
Article 6 Legal Personhood

No structural engagement.

ND
Article 7 Equality Before Law

No structural engagement.

ND
Article 8 Right to Remedy

No structural engagement.

ND
Article 9 No Arbitrary Detention

No structural engagement.

ND
Article 10 Fair Hearing

No structural engagement.

ND
Article 11 Presumption of Innocence

No structural engagement.

ND
Article 12 Privacy

Blog avoids tracking, but this is incidental rather than explicit engagement with privacy rights.

ND
Article 13 Freedom of Movement

No structural engagement.

ND
Article 14 Asylum

No structural engagement.

ND
Article 15 Nationality

No structural engagement.

ND
Article 16 Marriage & Family

No structural engagement.

ND
Article 17 Property

No structural engagement.

ND
Article 18 Freedom of Thought

No structural engagement.

ND
Article 19 Freedom of Expression

Blog structure supports open information dissemination without apparent censorship, but this is incidental to its function as a technical blog.

ND
Article 20 Assembly & Association

No structural engagement.

ND
Article 21 Political Participation

No structural engagement.

ND
Article 22 Social Security

No structural engagement.

ND
Article 23 Work & Equal Pay

No structural engagement.

ND
Article 24 Rest & Leisure

No structural engagement.

ND
Article 25 Standard of Living

No structural engagement.

ND
Article 26 Education

No structural engagement.

ND
Article 27 Cultural Participation

Blog shares technical and cultural content but does not structurally engage with Article 27 rights.

ND
Article 28 Social & International Order

No structural engagement.

ND
Article 29 Duties to Community

No structural engagement.

ND
Article 30 No Destruction of Rights

No structural engagement.

Supplementary Signals
How this content communicates, beyond directional lean. Learn more
Epistemic Quality
How well-sourced and evidence-based is this content?
0.78 medium claims
Sources
0.8
Evidence
0.8
Uncertainty
0.7
Purpose
0.9
Propaganda Flags
No manipulative rhetoric detected
0 techniques detected
Emotional Tone
Emotional character: positive/negative, intensity, authority
measured
Valence
-0.2
Arousal
0.4
Dominance
0.6
Transparency
Does the content identify its author and disclose interests?
0.67
✓ Author
More signals: context, framing & audience
Solution Orientation
Does this content offer solutions or only describe problems?
0.85 solution oriented
Reader Agency
0.8
Stakeholder Voice
Whose perspectives are represented in this content?
0.30 2 perspectives
Speaks: individuals
About: corporation
Temporal Framing
Is this content looking backward, at the present, or forward?
retrospective historical
Geographic Scope
What geographic area does this content cover?
unspecified
Complexity
How accessible is this content to a general audience?
technical high jargon domain specific
Audit Trail 7 entries
2026-02-28 12:28 eval Evaluated by claude-haiku-4-5-20251001: 0.00 (Neutral)
2026-02-28 10:43 rater_validation_warn Lite validation warnings for model llama-4-scout-wai: 0W 1R - -
2026-02-28 10:43 eval_success Lite evaluated: Neutral (0.00) - -
2026-02-28 10:43 eval Evaluated by llama-4-scout-wai: 0.00 (Neutral)
2026-02-28 10:37 eval_success Lite evaluated: Neutral (0.00) - -
2026-02-28 10:37 rater_validation_warn Lite validation warnings for model llama-3.3-70b-wai: 0W 1R - -
2026-02-28 10:37 eval Evaluated by llama-3.3-70b-wai: 0.00 (Neutral)