]> git.ipfire.org Git - thirdparty/git.git/commitdiff
mingw: use {gm,local}time_s as backend for {gm,local}time_r
authorDoan Tran Cong Danh <congdanhqx@gmail.com>
Thu, 28 Nov 2019 12:25:05 +0000 (19:25 +0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 2 Dec 2019 06:26:25 +0000 (22:26 -0800)
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>
compat/mingw.c

index fe609239dd6ba22a843b243647868f887014d40e..75695a24a3e9efc68fa565b40449080eeb0a801e 100644 (file)
@@ -986,16 +986,16 @@ int pipe(int filedes[2])
 
 struct tm *gmtime_r(const time_t *timep, struct tm *result)
 {
-       /* gmtime() in MSVCRT.DLL is thread-safe, but not reentrant */
-       memcpy(result, gmtime(timep), sizeof(struct tm));
-       return result;
+       if (gmtime_s(result, timep) == 0)
+               return result;
+       return NULL;
 }
 
 struct tm *localtime_r(const time_t *timep, struct tm *result)
 {
-       /* localtime() in MSVCRT.DLL is thread-safe, but not reentrant */
-       memcpy(result, localtime(timep), sizeof(struct tm));
-       return result;
+       if (localtime_s(result, timep) == 0)
+               return result;
+       return NULL;
 }
 
 char *mingw_getcwd(char *pointer, int len)