Merge branch 'jk/commit-dates-parsing-fix' into maint
authorJunio C Hamano <gitster@pobox.com>
Wed, 9 Apr 2014 18:59:38 +0000 (11:59 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 9 Apr 2014 18:59:38 +0000 (11:59 -0700)
* jk/commit-dates-parsing-fix:
t4212: loosen far-in-future test for AIX
date: recognize bogus FreeBSD gmtime output

Makefile
compat/gmtime.c [new file with mode: 0644]
config.mak.uname
git-compat-util.h
t/t4212-log-corrupt.sh
index dddaf4f287cf5cd5e99ad2587d53ba7582c51e29..132bfb3351890b57b0b808773f39aec32588e0ed 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -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
@@ -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
diff --git a/compat/gmtime.c b/compat/gmtime.c
new file mode 100644 (file)
index 0000000..e8362dd
--- /dev/null
@@ -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;
+}
index 7d31fad241761e41de655de6f42ddfb8c87ea4f2..efaed94d5d69439dc3612345679302577e68a25a 100644 (file)
@@ -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
index cbd86c37f51c00679498107d1a05131c19afa36e..d493a8c67ac1a91c40dfff0023c6ecf14155c09a 100644 (file)
@@ -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
index 3fa171541a161e0a5549c316b7c85608eb2d93d6..58b792bf20a1cd64435fca0b3d24b2417303f819 100755 (executable)
@@ -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