Re: [PATCH 5/5] mingw: use {gm,local}time_s as backend for {gm,local}time_r
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Nov 27, 2019, 19:35 UTC
- Message-ID
- <nycvar.QRO.7.76.6.1911272034550.31080@tvgsbejvaqbjf.bet>
- In-Reply-To
- <2c39f9a04f98fc3d365c80ce57e8edce305846fb.1574867409.git.congdanhqx@gmail.com>
Hi Danh,
On Wed, 27 Nov 2019, Doan Tran Cong Danh wrote:
Show 10 quoted lines
> 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 localtime_s as backend on
s/and localtime_s/and use localtime_s()/
Otherwise, this looks good to me, thank you!
Ciao, Dscho
Show 48 quoted lines
> 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>
> ---
> compat/mingw.c | 13 +++++++------
> 1 file changed, 7 insertions(+), 6 deletions(-)
>
> diff --git a/compat/mingw.c b/compat/mingw.c
> index fe609239dd..7b21f4eee5 100644
> --- a/compat/mingw.c
> +++ b/compat/mingw.c
> @@ -1,6 +1,7 @@
> #include "../git-compat-util.h"
> #include "win32.h"
> #include <conio.h>
> +#include <errno.h>
> #include <wchar.h>
> #include "../strbuf.h"
> #include "../run-command.h"
> @@ -986,16 +987,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)
> --
> 2.24.0.158.gd77a74f4dd.dirty
>
>