mingw: abort on invalid strftime formats
commit9ee0540a40988cf56611a341232dcb5bed6d1f06
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Mon, 19 Mar 2018 16:49:22 +0000 (19 17:49 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 19 Mar 2018 17:53:17 +0000 (19 10:53 -0700)
tree6cd4f3e97d01fe62ec52b7c5ce580eb13d8f52b8
parent38e79b1fdab9244e1727d0698afcf3bb8956c0a4
mingw: abort on invalid strftime formats

On Windows, strftime() does not silently ignore invalid formats, but
warns about them and then returns 0 and sets errno to EINVAL.

Unfortunately, Git does not expect such a behavior, as it disagrees
with strftime()'s semantics on Linux. As a consequence, Git
misinterprets the return value 0 as "I need more space" and grows the
buffer. As the larger buffer does not fix the format, the buffer grows
and grows and grows until we are out of memory and abort.

Ideally, we would switch off the parameter validation just for
strftime(), but we cannot even override the invalid parameter handler
via _set_thread_local_invalid_parameter_handler() using MINGW because
that function is not declared. Even _set_invalid_parameter_handler(),
which *is* declared, does not help, as it simply does... nothing.

So let's just bite the bullet and override strftime() for MINGW and
abort on an invalid format string. While this does not provide the
best user experience, it is the best we can do.

See https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx for more
details.

This fixes https://github.com/git-for-windows/git/issues/863

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
compat/mingw.c
compat/mingw.h