diff options
author | Josef 'Jeff' Sipek <jeffpc@josefsipek.net> | 2024-04-29 13:40:30 +0000 |
---|---|---|
committer | Toomas Soome <tsoome@FreeBSD.org> | 2024-05-01 04:56:41 +0000 |
commit | 9d1396c34611a2ed1e93c3cfb04db7a6148458bd (patch) | |
tree | 4a3738242eee0090b56c49597d4e7037c93a66ed | |
parent | 7b8b613d08d07bc0619685c59219e41517f337bf (diff) | |
download | src-9d1396c34611a2ed1e93c3cfb04db7a6148458bd.tar.gz src-9d1396c34611a2ed1e93c3cfb04db7a6148458bd.zip |
fattime: make the test code check beyond 32-bit time_t limits
On systems that have a 64-bit time_t, the test code now exercises the whole
range of fattime. To do this, this commit...
1. replaces the call to random() with two calls to arc4random() to
generate a 33-bit number of seconds in order to cover the entire range of
fattime [1970,2107]. (32-bits stops just short - in January 2106.)
On systems with 32-bit time_t, the extra bits are discarded and only the
time_t expressible range is tested.
2. casts time_t values passed to printf as longs and changes the format
string to match.
Now, the test code builds, runs, and exercises what it can (i.e., the whole
fattime range or the 32-bit time_t subset of it) on both 32-bit and 64-bit
time_t systems.
Reviewed by: imp
Differential Revision: https://reviews.freebsd.org/D44754
-rw-r--r-- | sys/kern/subr_fattime.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/sys/kern/subr_fattime.c b/sys/kern/subr_fattime.c index bdbc4e11827a..7b41b551eeef 100644 --- a/sys/kern/subr_fattime.c +++ b/sys/kern/subr_fattime.c @@ -84,6 +84,7 @@ #define YEAR 365 /* Length of normal year */ #define LYC (4 * YEAR + 1) /* Length of 4 year leap-year cycle */ #define T1980 (10 * 365 + 2) /* Days from 1970 to 1980 */ +#define T2108 (138 * 365 + 33) /* Days from 1970 to 2108 */ /* End of month is N days from start of (normal) year */ #define JAN 31 @@ -275,11 +276,17 @@ main(int argc __unused, char **argv __unused) for (i = 0; i < 10000; i++) { do { - ts.tv_sec = random(); - } while (ts.tv_sec < T1980 * 86400); + /* + * 32-bits gets us to 2106-02-07 06:28:15, but we + * need to get to the end of 2107. So, we generate + * a 36-bit second count to get us way past 2106. + */ + ts.tv_sec = ((time_t) arc4random() << 4) ^ arc4random(); + } while ((ts.tv_sec < T1980 * 86400) || (ts.tv_sec >= T2108 * 86400ull)); + ts.tv_nsec = random() % 1000000000; - printf("%10d.%03ld -- ", ts.tv_sec, ts.tv_nsec / 1000000); + printf("%10jd.%03ld -- ", (intmax_t) ts.tv_sec, ts.tv_nsec / 1000000); gmtime_r(&ts.tv_sec, &tm); strftime(buf, sizeof buf, "%Y %m %d %H %M %S", &tm); @@ -299,7 +306,7 @@ main(int argc __unused, char **argv __unused) ts.tv_sec = ts.tv_nsec = 0; fattime2timespec(d, t, p, 1, &ts); - printf("%10d.%03ld == ", ts.tv_sec, ts.tv_nsec / 1000000); + printf("%10jd.%03ld == ", (intmax_t) ts.tv_sec, ts.tv_nsec / 1000000); gmtime_r(&ts.tv_sec, &tm); strftime(buf, sizeof buf, "%Y %m %d %H %M %S", &tm); printf("%s -- ", buf); |