Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 15 Feb 2017 15:32:30 +0000 (UTC)
From:      Ed Maste <emaste@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r313774 - head/contrib/tzcode/stdtime
Message-ID:  <201702151532.v1FFWU5J001727@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: emaste
Date: Wed Feb 15 15:32:29 2017
New Revision: 313774
URL: https://svnweb.freebsd.org/changeset/base/313774

Log:
  localtime: return NULL if time_t out of range of struct tm
  
  Previously we would truncate tm.tm_year for any time_t corresponding to
  a year that does not fit in int.  This issue was discovered because it
  caused the bash-static build to fail when linking with LLD.
  
  As reported by Rafael EspĂ­ndola:
  
      Configure has
  
      AC_FUNC_MKTIME
  
      which expands to a test of mktime that fails with the freebsd
      implementation. Given that, bash compiles a mktime.o file that
      defines just mktime and uses localtime. That goes in a .a file
      that is before libc.
  
      The freebsd libc defines mktime in localtime.o, which also defines
      localtime among other functions.
  
      When lld sees an undefined reference to mktime from libc, it uses
      the bash provided one and then tries to find a definition of
      localtime. It is found on libc's localtime.o, but now we have a
      duplicated error.
  
      The reason it works with bfd is that bash doesn't use mktime
      directly and the undefined reference from libc is resolved to the
      libc implementation. It would also fail to link if bash itself
      directly used mktime.
  
  The bash-static configure test verifies that, for many values of t, either
  localtime(t) returns NULL or mktime(localtime(t)) == t.  This test failed
  when localtime returned a truncated tm_year.
  
  This was fixed in tzcode in 2004 but has persisted in our tree since
  rS2708.
  
  Reported by:	Rafael EspĂ­ndola
  Reviewed by:	bapt
  MFC after:	2 weeks
  Sponsored by:	The FreeBSD Foundation
  Differential Revision:	https://reviews.freebsd.org/D9534

Modified:
  head/contrib/tzcode/stdtime/localtime.c

Modified: head/contrib/tzcode/stdtime/localtime.c
==============================================================================
--- head/contrib/tzcode/stdtime/localtime.c	Wed Feb 15 15:18:43 2017	(r313773)
+++ head/contrib/tzcode/stdtime/localtime.c	Wed Feb 15 15:32:29 2017	(r313774)
@@ -1453,14 +1453,13 @@ localtime(const time_t *const timep)
 		}
 		_RWLOCK_RDLOCK(&lcl_rwlock);
 		tzset_basic(1);
-		localsub(timep, 0L, p_tm);
+		p_tm = localsub(timep, 0L, p_tm);
 		_RWLOCK_UNLOCK(&lcl_rwlock);
-		return(p_tm);
 	} else {
 		tzset_basic(0);
-		localsub(timep, 0L, &tm);
-		return(&tm);
+		p_tm = localsub(timep, 0L, &tm);
 	}
+	return(p_tm);
 }
 
 /*
@@ -1472,7 +1471,7 @@ localtime_r(const time_t *const timep, s
 {
 	_RWLOCK_RDLOCK(&lcl_rwlock);
 	tzset_basic(1);
-	localsub(timep, 0L, tmp);
+	tmp = localsub(timep, 0L, tmp);
 	_RWLOCK_UNLOCK(&lcl_rwlock);
 	return tmp;
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201702151532.v1FFWU5J001727>