diff options
author | Doan Tran Cong Danh <congdanhqx@gmail.com> | 2019-11-28 19:25:05 +0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2019-12-01 22:26:25 -0800 |
commit | 0109d676f9d4d6f9d149d5194bdb200c6de3fcca (patch) | |
tree | 132a75ef5d591e38d1a0c43b0eea2167088c2caa /compat | |
parent | archive-zip.c: switch to reentrant localtime_r (diff) | |
download | tgif-0109d676f9d4d6f9d149d5194bdb200c6de3fcca.tar.xz |
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>
Diffstat (limited to 'compat')
-rw-r--r-- | compat/mingw.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/compat/mingw.c b/compat/mingw.c index fe609239dd..75695a24a3 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -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) |