mirror of
https://github.com/Dasharo/edk2.git
synced 2026-06-13 10:16:24 -07:00
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:
@@ -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. **/
|
||||
|
||||
Reference in New Issue
Block a user