Skip to content

Commit 0109d67

Browse files
sgngitster
authored andcommitted
mingw: use {gm,local}time_s as backend for {gm,local}time_r
Since Windows doesn't provide gmtime_r(3) and localtime_r(3), we're providing a compat version by using non-reentrant gmtime(3) and localtime(3) as backend. Then, we copy the returned data into the buffer. By doing that, in case of failure, we will dereference a NULL pointer returned by gmtime(3), and localtime(3), and we always return a valid pointer instead of NULL. Drop the memcpy(3) by using gmtime_s(), and use localtime_s() as the backend on Windows, and make sure we will return NULL in case of failure. Cc: Johannes Sixt <[email protected]> Cc: Johannes Schindelin <[email protected]> Signed-off-by: Doan Tran Cong Danh <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent b5ab03b commit 0109d67

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

compat/mingw.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -986,16 +986,16 @@ int pipe(int filedes[2])
986986

987987
struct tm *gmtime_r(const time_t *timep, struct tm *result)
988988
{
989-
/* gmtime() in MSVCRT.DLL is thread-safe, but not reentrant */
990-
memcpy(result, gmtime(timep), sizeof(struct tm));
991-
return result;
989+
if (gmtime_s(result, timep) == 0)
990+
return result;
991+
return NULL;
992992
}
993993

994994
struct tm *localtime_r(const time_t *timep, struct tm *result)
995995
{
996-
/* localtime() in MSVCRT.DLL is thread-safe, but not reentrant */
997-
memcpy(result, localtime(timep), sizeof(struct tm));
998-
return result;
996+
if (localtime_s(result, timep) == 0)
997+
return result;
998+
return NULL;
999999
}
10001000

10011001
char *mingw_getcwd(char *pointer, int len)

0 commit comments

Comments
 (0)