From dbfcdc186dc4c4791523dcd43c2f060f687cd763 Mon Sep 17 00:00:00 2001 From: Sergii Dmytruk Date: Thu, 15 Aug 2024 20:44:17 +0300 Subject: [PATCH] CryptoPkg/BaseCryptLib[MbedTls]/SysCall/TimerWrapper.c: fix memory leak Make gmtime() return pointer to a statically allocated storage. This is how it's documented and that's how it gets used. The API isn't thread-safe but given that EDK2 is essentially single-threaded (MP Services Protocol is a special exception). Given that this code gets run at runtime phase, the leak could potentially be used to exhaust memory reserved for the runtime phase. Signed-off-by: Sergii Dmytruk --- .../BaseCryptLib/SysCall/TimerWrapper.c | 34 ++++++++----------- .../SysCall/TimerWrapper.c | 34 ++++++++----------- 2 files changed, 30 insertions(+), 38 deletions(-) diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/TimerWrapper.c b/CryptoPkg/Library/BaseCryptLib/SysCall/TimerWrapper.c index 894aeb016f..54fa955817 100644 --- a/CryptoPkg/Library/BaseCryptLib/SysCall/TimerWrapper.c +++ b/CryptoPkg/Library/BaseCryptLib/SysCall/TimerWrapper.c @@ -169,7 +169,8 @@ gmtime ( const time_t *timer ) { - struct tm *GmTime; + STATIC struct tm GmTime; + UINT64 DayNo; UINT64 DayRemainder; time_t Year; @@ -182,23 +183,18 @@ gmtime ( return NULL; } - GmTime = malloc (sizeof (struct tm)); - if (GmTime == NULL) { - return NULL; - } - - ZeroMem ((VOID *)GmTime, (UINTN)sizeof (struct tm)); + ZeroMem ((VOID *)&GmTime, (UINTN)sizeof (GmTime)); DayNo = (UINT64)DivS64x64Remainder (*timer, SECSPERDAY, &Remainder); DayRemainder = (UINT64)Remainder; DivS64x64Remainder (DayRemainder, SECSPERMIN, &Remainder); - GmTime->tm_sec = (int)Remainder; + GmTime.tm_sec = (int)Remainder; DivS64x64Remainder (DayRemainder, SECSPERHOUR, &Remainder); - GmTime->tm_min = (int)DivS64x64Remainder (Remainder, SECSPERMIN, NULL); - GmTime->tm_hour = (int)DivS64x64Remainder (DayRemainder, SECSPERHOUR, NULL); + GmTime.tm_min = (int)DivS64x64Remainder (Remainder, SECSPERMIN, NULL); + GmTime.tm_hour = (int)DivS64x64Remainder (DayRemainder, SECSPERHOUR, NULL); DivS64x64Remainder ((DayNo + 4), 7, &Remainder); - GmTime->tm_wday = (int)Remainder; + GmTime.tm_wday = (int)Remainder; for (Year = 1970, YearNo = 0; DayNo > 0; Year++) { TotalDays = (UINT32)(IsLeap (Year) ? 366 : 365); @@ -210,8 +206,8 @@ gmtime ( } } - GmTime->tm_year = (int)(YearNo + (1970 - 1900)); - GmTime->tm_yday = (int)DayNo; + GmTime.tm_year = (int)(YearNo + (1970 - 1900)); + GmTime.tm_yday = (int)DayNo; for (MonthNo = 12; MonthNo > 1; MonthNo--) { if (DayNo >= CumulativeDays[IsLeap (Year)][MonthNo]) { @@ -220,14 +216,14 @@ gmtime ( } } - GmTime->tm_mon = (int)MonthNo - 1; - GmTime->tm_mday = (int)DayNo + 1; + GmTime.tm_mon = (int)MonthNo - 1; + GmTime.tm_mday = (int)DayNo + 1; - GmTime->tm_isdst = 0; - GmTime->tm_gmtoff = 0; - GmTime->tm_zone = NULL; + GmTime.tm_isdst = 0; + GmTime.tm_gmtoff = 0; + GmTime.tm_zone = NULL; - return GmTime; + return &GmTime; } unsigned int diff --git a/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/TimerWrapper.c b/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/TimerWrapper.c index 0db9c8602e..4e164197e4 100644 --- a/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/TimerWrapper.c +++ b/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/TimerWrapper.c @@ -113,7 +113,8 @@ gmtime ( const time_t *timer ) { - struct tm *GmTime; + STATIC struct tm GmTime; + UINT16 DayNo; UINT16 DayRemainder; time_t Year; @@ -125,20 +126,15 @@ gmtime ( return NULL; } - GmTime = AllocateZeroPool (sizeof (struct tm)); - if (GmTime == NULL) { - return NULL; - } - - ZeroMem ((VOID *)GmTime, (UINTN)sizeof (struct tm)); + ZeroMem ((VOID *)&GmTime, (UINTN)sizeof (GmTime)); DayNo = (UINT16)(*timer / SECSPERDAY); DayRemainder = (UINT16)(*timer % SECSPERDAY); - GmTime->tm_sec = (int)(DayRemainder % SECSPERMIN); - GmTime->tm_min = (int)((DayRemainder % SECSPERHOUR) / SECSPERMIN); - GmTime->tm_hour = (int)(DayRemainder / SECSPERHOUR); - GmTime->tm_wday = (int)((DayNo + 4) % 7); + GmTime.tm_sec = (int)(DayRemainder % SECSPERMIN); + GmTime.tm_min = (int)((DayRemainder % SECSPERHOUR) / SECSPERMIN); + GmTime.tm_hour = (int)(DayRemainder / SECSPERHOUR); + GmTime.tm_wday = (int)((DayNo + 4) % 7); for (Year = 1970, YearNo = 0; DayNo > 0; Year++) { TotalDays = (UINT16)(IsLeap (Year) ? 366 : 365); @@ -150,8 +146,8 @@ gmtime ( } } - GmTime->tm_year = (int)(YearNo + (1970 - 1900)); - GmTime->tm_yday = (int)DayNo; + GmTime.tm_year = (int)(YearNo + (1970 - 1900)); + GmTime.tm_yday = (int)DayNo; for (MonthNo = 12; MonthNo > 1; MonthNo--) { if (DayNo >= CumulativeDays[IsLeap (Year)][MonthNo]) { @@ -160,14 +156,14 @@ gmtime ( } } - GmTime->tm_mon = (int)MonthNo - 1; - GmTime->tm_mday = (int)DayNo + 1; + GmTime.tm_mon = (int)MonthNo - 1; + GmTime.tm_mday = (int)DayNo + 1; - GmTime->tm_isdst = 0; - GmTime->tm_gmtoff = 0; - GmTime->tm_zone = NULL; + GmTime.tm_isdst = 0; + GmTime.tm_gmtoff = 0; + GmTime.tm_zone = NULL; - return GmTime; + return &GmTime; } /**_time64 function. **/