[HN Gopher] Investigating why Steam started picking a random font ___________________________________________________________________ Investigating why Steam started picking a random font Author : rbanffy Score : 308 points Date : 2022-11-19 19:12 UTC (3 hours ago) (HTM) web link (blog.pkh.me) (TXT) w3m dump (blog.pkh.me) | develatio wrote: | > 2038 is going to be a lot of fun | | Indeed it will be! | kevin_thibedeau wrote: | 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. | gary_0 wrote: | We're gonna party like it's 1999! | deathanatos wrote: | Actually, we'll probably be partying like it's Fri Dec 13 | 1901 20:45:52 GMT. | | Ooh, Friday the 13th too, ominous. | CodesInChaos wrote: | At least we won't have to suffer though the 2106 problem. | hoosieree wrote: | Oh jeez, it's going to be so much worse than y2k. | TillE wrote: | 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. | cesarb wrote: | > 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 | yyyk wrote: | 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. | shadowgovt wrote: | (me before opening the link) "... on Linux." | | _click_ | | "Hm, yes." | the_af wrote: | 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. | shadowgovt wrote: | The 2038 bug is definitely expected, and unlike in Linux, | with its highly distributed and composable architecture, | management of fonts on Windows is a responsibility of the | monolithic operating system maintained by one company. | | It's not out of the realm of possibility, but I'd be a little | startled if Windows hasn't already been gone over with a fine | tooth comb for Y-2038 issues. | lazide wrote: | Considering how many crazy bugs are getting introduced now | in windows, I wouldn't be that surprised. | taeric wrote: | Pretty sure one of the things they did in windows land was | to just stop supporting 32 bit software. | asddubs wrote: | but windows still supports 32 bit executables, I'm pretty | sure? | taeric wrote: | You could probably guess I don't claim to be | authoritative here. :D I just recall there was a story | not long ago about them doing some hard decisions going | into 64 bit. https://learn.microsoft.com/en- | us/troubleshoot/windows-serve... seems to indicate that | you should mostly expect it to work. | | Odds are high I just saw the headlines about how they are | stopping 32 bit sales of their OS. Though, I couldn't | tell you for sure what I was misremembering. | userbinator wrote: | Windows' native API for dates consists of the types FILETIME | and SYSTEMTIME which will handle 5-digit years, and even the | old MS-DOS FAT timestamp goes up to 2107. The 2038 problem | came from Unix and applications which use 32-bit Unix epoch | time. | naikrovek wrote: | appleflaxen wrote: | What an amazing anecdote. 2038 will likely be very crazy. | nyanpasu64 wrote: | 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. | dylan604 wrote: | 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. | hoppla wrote: | 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 | Twirrim wrote: | 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. | wentin wrote: | 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 | joosters wrote: | 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. | cesarb wrote: | > 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). | joosters wrote: | Sure, but EOVERFLOW isn't coming from stat() in this case, is | it? The man page states that this is returned for problems | with file _sizes_ too big for 32 bits, not for struct | timespecs. Something else must be doing things with the | atime, I would guess? | quietbritishjim wrote: | I think stat() in the 32bit version of libc is making the | 64 bit system call to get the value from the kernel and | noticing that it would overflow. The man page for stat() | [1] says that EOVERFLOW is a possible error value so that | lines up. | | [1] https://man7.org/linux/man-pages/man2/lstat.2.html | cesarb wrote: | > I think stat() in the 32bit version of libc is making | the 64 bit system call to get the value from the kernel | and noticing that it would overflow. | | I'm not certain I'm looking at the correct file, but that | does seem to be the case, at least on latest glibc: stat | redirects to fstatat(AT_FDCWD) (https://sourceware.org/gi | t/?p=glibc.git;a=blob;f=sysdeps/uni...), and fstatat | calls a 64-bit system call and fails with EOVERFLOW if | any of st_ino, st_size, st_blocks, st_atim, st_mtim, | st_ctim wouldn't fit in the 32-bit struct (https://source | ware.org/git/?p=glibc.git;a=blob;f=sysdeps/uni...). | | Yes, st_ino too, which means it could also break on a | filesystem with large enough inode numbers. Using a | 32-bit userspace nowadays seems more problematic the more | I look. | userbinator wrote: | In this case, just letting it roll over to the 70s | would've probably not created this bug. | joosters wrote: | Yes, I read that man page. It states: | EOVERFLOW: pathname or fd refers to a file whose size, | inode number, or number of blocks cannot be represented | in, respectively, the types off_t, ino_t, or blkcnt_t. | This error can occur when, for example, an application | compiled on a 32-bit platform without | D_FILE_OFFSET_BITS=64 calls stat() on a file whose size | exceeds (1<<31)-1 bytes. | | None of off_t, ino_t or blkcnt_t are to do with times, | they are related to file size. The man page has nothing | to say about EOVERFLOW and times. Perhaps the man page is | out of date, or perhaps it is another syscall that is | returning EOVERFLOW? | | I'd be surprised if it was actual userspace code in the | font library that was generating that errno. After all, | if you care enough to spot an overflow in your | calculations, you probably care enough to handle that | error case better (and know enough about the situation to | handle it properly). Something must be making a specific | syscall, getting EOVERFLOW, then throwing it back up to | the user. But is it really the ubiquitous stat() ? | [deleted] | phshift wrote: | Note: The linux manpages cover the syscall interface of | the linux kernel, not the glibc implementation. You can | check the glibc source code yourself, but glibc will set | errno for multiple reasons outside of the raw syscall, | including for time overflows. | cesarb wrote: | > Note: The linux manpages cover the syscall interface of | the linux kernel, not the glibc implementation. | | They cover both, but they focus more on the glibc | wrappers. For instance, the manpage for stat(2) we're | talking about says "On success, zero is returned. On | error, -1 is returned, and errno is set to indicate the | error.", which is not the syscall interface return value | (the syscall does not know about errno, it returns the | negative of what will end up in errno instead of -1). | Another example is the manpage for exit(2), about the | _exit() function (the exit() function, without the | underscore, is at exit(3) since it's not a system call), | which says "In glibc up to version 2.3, the _exit() | wrapper function invoked the kernel system call of the | same name. Since glibc 2.3, the wrapper function invokes | exit_group(2), in order to terminate of the threads in a | process." | ericyd wrote: | CaliforniaKarl wrote: | Holy heck I love that. Try to cheese a Stanley Parable | achievement, and one dependency deep down inside Steam breaks. | damiante wrote: | I have a similar issue with Caprine, the desktop frontend for | Facebook Messenger. I have not however messed with my datetime | settings, not is it such a big issue that I have taken the time | to try to fix it (I don't use Messenger often and on desktop even | less). | nickphx wrote: | I've used https://github.com/gibbed/SteamAchievementManager. To | unlock game achievements on steam. | notafraudster wrote: | Cheating to get the Stanley Parable achievement devalues the hard | work that all the rest of us did to earn it. | mrighele wrote: | 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. | labster wrote: | Username checks out. | js8 wrote: | Better play it today, because after 2028, you're never getting | the achievement. | WJW wrote: | Unless steam updates their font dependencies somewhere in the | upcoming 16 years, of course? | [deleted] | thesnide wrote: | Nice. | | Spoiler ahead: But I'd use faketime in userspace to avoid messing | up the system ;) | M4v3R wrote: | 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. | MrLeap wrote: | Is this in the ps1 version, the pc port, or are we talking the | remake or something else? | cesarb wrote: | > 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. | Scalene2 wrote: | Quick question, do most OSes need admin/root/whatever perms to | change the system time? If not, I wonder if there are any | potential serious exploits that could take advantage of this | ability. | johnchristopher wrote: | 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_ | cpeterso wrote: | Sounds like a graphics driver bug, as if it was reusing some | GPU textures in both applications. | MichaelZuo wrote: | Maybe no one understands how computers really work. | kevin_thibedeau wrote: | They're magic. The question is will we become Asgardians or | Eloi. ___________________________________________________________________ (page generated 2022-11-19 23:00 UTC)