Skip to content

Commit

Permalink
Merge branch 'jk/commit-dates-parsing-fix' into maint
Browse files Browse the repository at this point in the history
* jk/commit-dates-parsing-fix:
  t4212: loosen far-in-future test for AIX
  date: recognize bogus FreeBSD gmtime output
  • Loading branch information
Junio C Hamano committed Apr 9, 2014
2 parents 693b407 + f80d1f9 commit b8a3019
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 4 deletions.
8 changes: 8 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -1494,6 +1497,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
Expand Down
29 changes: 29 additions & 0 deletions compat/gmtime.c
Original file line number Diff line number Diff line change
@@ -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;
}
1 change: 1 addition & 0 deletions config.mak.uname
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,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
Expand Down
7 changes: 7 additions & 0 deletions git-compat-util.h
Original file line number Diff line number Diff line change
Expand Up @@ -721,4 +721,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
6 changes: 2 additions & 4 deletions t/t4212-log-corrupt.sh
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,9 @@ test_expect_success 'date parser recognizes time_t overflow' '
'

# date is within 2^63-1, but enough to choke glibc's gmtime
test_expect_success 'absurdly far-in-future dates produce sentinel' '
test_expect_success 'absurdly far-in-future date' '
commit=$(munge_author_date HEAD 999999999999999999) &&
echo "Thu Jan 1 00:00:00 1970 +0000" >expect &&
git log -1 --format=%ad $commit >actual &&
test_cmp expect actual
git log -1 --format=%ad $commit
'

test_done

0 comments on commit b8a3019

Please sign in to comment.