aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosef 'Jeff' Sipek <jeffpc@josefsipek.net>2024-04-29 13:40:30 +0000
committerToomas Soome <tsoome@FreeBSD.org>2024-05-01 04:56:41 +0000
commit9d1396c34611a2ed1e93c3cfb04db7a6148458bd (patch)
tree4a3738242eee0090b56c49597d4e7037c93a66ed
parent7b8b613d08d07bc0619685c59219e41517f337bf (diff)
downloadsrc-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.c15
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);