@matheusbsbs / matheus-bagliano / commits / 0109d676f9
Fork 0

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 <j6t@kdbg.org> Cc: Johannes Schindelin <Johannes.Schindelin@gmx.de> Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Doan Tran Cong Danh committed Nov 28, 2019 at 19:25 UTC 0109d676f9d4d6f9d149d5194bdb200c6de3fcca
1 file changed +6 -6
compat/mingw.c
+6 -6
@@ -986,16 +986,16 @@ int pipe(int filedes[2])
986
987 struct tm *gmtime_r(const time_t *timep, struct tm *result)
988 {
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;
992 }
993
994 struct tm *localtime_r(const time_t *timep, struct tm *result)
995 {
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;
999 }
1000
1001 char *mingw_getcwd(char *pointer, int len)