]> git.proxmox.com Git - mirror_edk2.git/commitdiff
CryptoPkg/BaseCryptLib:time overflow
authorZihong Yi <yizihong@huawei.com>
Fri, 2 Dec 2022 05:51:50 +0000 (13:51 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Sat, 3 Dec 2022 09:01:38 +0000 (09:01 +0000)
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4167

In CrtLibSupport.h, time_t is defined as INT32, and its maximum value
is 2147483647. That is, the corresponding maximum timestamp is
2038-01-19 11:14:07. Therefore, overflow occurs when the test time
exceeds 2038-01-19 11:14:07. So change the type of time_t to INT64 and
also change the type of variables in function gmtime which calculated
with time_t.

Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Xiaoyu Lu <xiaoyu1.lu@intel.com>
Cc: Guomin Jiang <guomin.jiang@intel.com>
Signed-off-by: Zihong Yi <yizihong@huawei.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
CryptoPkg/Library/BaseCryptLib/SysCall/TimerWrapper.c
CryptoPkg/Library/Include/CrtLibSupport.h

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
index 5072c343da57f73506391548b36192063889afee..94b0e6b6014fe1d0175472fe786355a1daf5c470 100644 (file)
@@ -109,7 +109,7 @@ typedef UINTN   off_t;
 typedef UINTN   u_int;\r
 typedef INTN    ptrdiff_t;\r
 typedef INTN    ssize_t;\r
-typedef INT32   time_t;\r
+typedef INT64   time_t;\r
 typedef UINT8   __uint8_t;\r
 typedef UINT8   sa_family_t;\r
 typedef UINT8   u_char;\r