1
0
mirror of https://github.com/git/git synced 2024-07-04 16:48:40 +00:00

date: recognize bogus FreeBSD gmtime output

Most gmtime implementations return a NULL value when they
encounter an error (and this behavior is specified by ANSI C
and POSIX).  FreeBSD's implementation, however, will simply
leave the "struct tm" untouched.  Let's also recognize this
and convert it to a NULL (with this patch, t4212 should pass
on FreeBSD).

Reported-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2014-04-01 17:28:42 -04:00 committed by Junio C Hamano
parent 3f419d45ef
commit 6654754779
4 changed files with 45 additions and 0 deletions

View File

@ -342,6 +342,9 @@ all::
# Define DEFAULT_HELP_FORMAT to "man", "info" or "html"
# (defaults to "man") if you want to have a different default when
# "git help" is called without a parameter specifying the format.
#
# Define GMTIME_UNRELIABLE_ERRORS if your gmtime() function does not
# return NULL when it receives a bogus time_t.
GIT-VERSION-FILE: FORCE
@$(SHELL_PATH) ./GIT-VERSION-GEN
@ -1464,6 +1467,11 @@ ifneq (,$(XDL_FAST_HASH))
BASIC_CFLAGS += -DXDL_FAST_HASH
endif
ifdef GMTIME_UNRELIABLE_ERRORS
COMPAT_OBJS += compat/gmtime.o
BASIC_CFLAGS += -DGMTIME_UNRELIABLE_ERRORS
endif
ifeq ($(TCLTK_PATH),)
NO_TCLTK = NoThanks
endif

29
compat/gmtime.c Normal file
View File

@ -0,0 +1,29 @@
#include "../git-compat-util.h"
#undef gmtime
#undef gmtime_r
struct tm *git_gmtime(const time_t *timep)
{
static struct tm result;
return git_gmtime_r(timep, &result);
}
struct tm *git_gmtime_r(const time_t *timep, struct tm *result)
{
struct tm *ret;
memset(result, 0, sizeof(*result));
ret = gmtime_r(timep, result);
/*
* Rather than NULL, FreeBSD gmtime simply leaves the "struct tm"
* untouched when it encounters overflow. Since "mday" cannot otherwise
* be zero, we can test this very quickly.
*/
if (ret && !ret->tm_mday) {
ret = NULL;
errno = EOVERFLOW;
}
return ret;
}

View File

@ -189,6 +189,7 @@ ifeq ($(uname_S),FreeBSD)
endif
PYTHON_PATH = /usr/local/bin/python
HAVE_PATHS_H = YesPlease
GMTIME_UNRELIABLE_ERRORS = UnfortunatelyYes
endif
ifeq ($(uname_S),OpenBSD)
NO_STRCASESTR = YesPlease

View File

@ -697,4 +697,11 @@ void warn_on_inaccessible(const char *path);
/* Get the passwd entry for the UID of the current process. */
struct passwd *xgetpwuid_self(void);
#ifdef GMTIME_UNRELIABLE_ERRORS
struct tm *git_gmtime(const time_t *);
struct tm *git_gmtime_r(const time_t *, struct tm *);
#define gmtime git_gmtime
#define gmtime_r git_gmtime_r
#endif
#endif