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>
		
			
				
	
	
		
			30 lines
		
	
	
		
			605 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			30 lines
		
	
	
		
			605 B
		
	
	
	
		
			C
		
	
	
	
	
	
#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;
 | 
						|
}
 |