Y2038, glibc and wtmp on 64bit architectures
On January, 19th 2038 at 03:14:07 UTC the 32bit time_t counter will overflow. For more information about this I suggest to start with the wikipedia Year 2038 problem article. That problem is long known and several groups are working on a solution for 32bit systems, but many people don’t know that pure 64bit systems could be affected, too.
The general statement so far has always been that on 64bit systems with a 64bit time_t you are safe with respect to the Y2038 problem. But glibc uses for compatibility with 32bit userland applications 32bit time_t in some places even on 64bit systems. More information can be found in my previous blog Y2038, glibc and utmp/utmpx on 64bit architectures.
In this article I will present a generic solution for wtmp.
wtmp actually good for? From the manual page:
The wtmp file records all logins and logouts.
What are the problems?
There is one main problem with with with glibc on e.g. x86-64:
- A 32bit time_t field is used for the time, which will overflow in 2038
Who is really using wtmp today?
There are several applications writing
wtmp entries, all are to login to a system:
Additional systemd writes reboot/shutdown entries to /var/log/wtmp.
Who is using (means reading) the
So in the end, there is more or less only one tool really consuming the
The login and logout times will be stored in a sqlite3 database. There is a library
libwtmpdb.so which provides a Y2038 secure API on all architectures (32bit and 64bit). Additional, there is a PAM module
pam_wtmpdb.so and a binary
The module allows to use this functionality in any PAM aware application. Today every application used for login and authentication uses PAM, so this should be no problem.
wtmpdb binary will replace
last and some more features to e.g. to store boot and shutdown times.
Were other alternatives evaluated?
Yes, but in the end, sqlite was the most widespread, robust, well maintained database library available today. And hiding everything in a library is the only future proof solution, to be flexible in the future and to maintain the code only in one place.
The source code for the
libwtmpdb library, PAM module and application can be found in the wtmpdb repository on github.