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 <sergii.dmytruk@3mdeb.com>
This commit is contained in:
Sergii Dmytruk
2024-08-15 20:44:17 +03:00
parent 2b9c738a10
commit dbfcdc186d
2 changed files with 30 additions and 38 deletions
@@ -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
@@ -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. **/