forked from xiaolai/git
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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 <[email protected]> Signed-off-by: Jeff King <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
- Loading branch information
Showing
4 changed files
with
45 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters