Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 438dd926 authored by Steve French's avatar Steve French
Browse files

[CIFS] Fix leaps year calculation for years after 2100



Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
parent 268f3be1
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -946,6 +946,15 @@ struct timespec cnvrtDosUnixTm(__u16 date, __u16 time)
	year = sd->Year;
	year = sd->Year;
	days += year * 365;
	days += year * 365;
	days += (year/4); /* leap year */
	days += (year/4); /* leap year */
	/* generalized leap year calculation is more complex, ie no leap year
	for years/100 except for years/400, but since the maximum number for DOS
	 year is 2**7, the last year is 1980+127, which means we need only
	 consider 2 special case years, ie the years 2000 and 2100, and only
	 adjust for the lack of leap year for the year 2100, as 2000 was a 
	 leap year (divisable by 400) */
	if(year >= 120)  /* the year 2100 */
		days = days - 1;  /* do not count leap year for the year 2100 */

	/* adjust for leap year where we are still before leap day */
	/* adjust for leap year where we are still before leap day */
	days -= ((year & 0x03) == 0) && (month < 2 ? 1 : 0);
	days -= ((year & 0x03) == 0) && (month < 2 ? 1 : 0);
	sec += 24 * 60 * 60 * days; 
	sec += 24 * 60 * 60 * days;