]> git.proxmox.com Git - mirror_edk2.git/blobdiff - CryptoPkg/Library/BaseCryptLib/SysCall/TimerWrapper.c
CryptoPkg/BaseCryptLib:time overflow
[mirror_edk2.git] / CryptoPkg / Library / BaseCryptLib / SysCall / TimerWrapper.c
index bf8a5325817f938f89cfdf42180b8b0678f4edb6..2dfc6fe6c5932cdb732be6df5ecbfe344b9e6e7e 100644 (file)
@@ -15,7 +15,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 // -- Time Management Routines --\r
 //\r
 \r
-#define IsLeap(y)  (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))\r
 #define SECSPERMIN   (60)\r
 #define SECSPERHOUR  (60 * 60)\r
 #define SECSPERDAY   (24 * SECSPERHOUR)\r
@@ -60,6 +59,26 @@ UINTN  CumulativeDays[2][14] = {
   }\r
 };\r
 \r
+/* Check the year is leap or not. */\r
+// BOOLEAN IsLeap(\r
+//  INTN timer\r
+//  )\r
+BOOLEAN\r
+IsLeap (\r
+  time_t  timer\r
+  )\r
+{\r
+  INT64  Remainder1;\r
+  INT64  Remainder2;\r
+  INT64  Remainder3;\r
+\r
+  DivS64x64Remainder (timer, 4, &Remainder1);\r
+  DivS64x64Remainder (timer, 100, &Remainder2);\r
+  DivS64x64Remainder (timer, 400, &Remainder3);\r
+\r
+  return (Remainder1 == 0 && (Remainder2 != 0 || Remainder3 == 0));\r
+}\r
+\r
 /* Get the system time as seconds elapsed since midnight, January 1, 1970. */\r
 // INTN time(\r
 //  INTN *timer\r
@@ -117,12 +136,13 @@ gmtime (
   )\r
 {\r
   struct tm  *GmTime;\r
-  UINT16     DayNo;\r
-  UINT32     DayRemainder;\r
+  UINT64     DayNo;\r
+  UINT64     DayRemainder;\r
   time_t     Year;\r
   time_t     YearNo;\r
-  UINT16     TotalDays;\r
-  UINT16     MonthNo;\r
+  UINT32     TotalDays;\r
+  UINT32     MonthNo;\r
+  INT64      Remainder;\r
 \r
   if (timer == NULL) {\r
     return NULL;\r
@@ -135,18 +155,21 @@ gmtime (
 \r
   ZeroMem ((VOID *)GmTime, (UINTN)sizeof (struct tm));\r
 \r
-  DayNo        = (UINT16)(*timer / SECSPERDAY);\r
-  DayRemainder = (UINT32)(*timer % SECSPERDAY);\r
+  DayNo        = (UINT64)DivS64x64Remainder (*timer, SECSPERDAY, &Remainder);\r
+  DayRemainder = (UINT64)Remainder;\r
 \r
-  GmTime->tm_sec  = (int)(DayRemainder % SECSPERMIN);\r
-  GmTime->tm_min  = (int)((DayRemainder % SECSPERHOUR) / SECSPERMIN);\r
-  GmTime->tm_hour = (int)(DayRemainder / SECSPERHOUR);\r
-  GmTime->tm_wday = (int)((DayNo + 4) % 7);\r
+  DivS64x64Remainder (DayRemainder, SECSPERMIN, &Remainder);\r
+  GmTime->tm_sec = (int)Remainder;\r
+  DivS64x64Remainder (DayRemainder, SECSPERHOUR, &Remainder);\r
+  GmTime->tm_min  = (int)DivS64x64Remainder (Remainder, SECSPERMIN, NULL);\r
+  GmTime->tm_hour = (int)DivS64x64Remainder (DayRemainder, SECSPERHOUR, NULL);\r
+  DivS64x64Remainder ((DayNo + 4), 7, &Remainder);\r
+  GmTime->tm_wday = (int)Remainder;\r
 \r
   for (Year = 1970, YearNo = 0; DayNo > 0; Year++) {\r
-    TotalDays = (UINT16)(IsLeap (Year) ? 366 : 365);\r
+    TotalDays = (UINT32)(IsLeap (Year) ? 366 : 365);\r
     if (DayNo >= TotalDays) {\r
-      DayNo = (UINT16)(DayNo - TotalDays);\r
+      DayNo = (UINT64)(DayNo - TotalDays);\r
       YearNo++;\r
     } else {\r
       break;\r
@@ -158,7 +181,7 @@ gmtime (
 \r
   for (MonthNo = 12; MonthNo > 1; MonthNo--) {\r
     if (DayNo >= CumulativeDays[IsLeap (Year)][MonthNo]) {\r
-      DayNo = (UINT16)(DayNo - (UINT16)(CumulativeDays[IsLeap (Year)][MonthNo]));\r
+      DayNo = (UINT64)(DayNo - (UINT32)(CumulativeDays[IsLeap (Year)][MonthNo]));\r
       break;\r
     }\r
   }\r