DragonFlyBSD Kernel Audit
DF-2955 / fix.diff
← back to finding ↓ download raw
--- a/sys/kern/subr_fattime.c	2026-06-29 12:51:19.000000000 +0000
+++ b/sys/kern/subr_fattime.c	2026-09-04 04:46:18.427316158 +0000
@@ -80,6 +80,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 T2107	((2108 - 1980) * YEAR + 31 - 1)	/* Days 1980 to 2107-12-31 */
 
 /* End of month is N days from start of (normal) year */
 #define JAN	31
@@ -162,6 +163,13 @@
 			t2 -= T1980;
 
 			/*
+			 * Impossible date (FAT cannot represent
+			 * anything past 2107-12-31): saturate.
+			 */
+			if (t2 > T2107)
+				t2 = T2107;
+
+			/*
 			 * 2100 is not a leap year.
 			 * XXX: a 32 bit time_t can not get us here.
 			 */
@@ -248,7 +256,8 @@
 	/* Align with time_t epoch */
 	day += T1980;
 
-	tsp->tv_sec += DAY * day;
+	/* 64-bit time_t: keep the product from wrapping in 32 bits */
+	tsp->tv_sec += (time_t)DAY * day;
 	if (!utc)
 		tsp->tv_sec += 0; // XXX utc_offset();
 }