aboutsummaryrefslogtreecommitdiff
path: root/contrib/tzcode
diff options
context:
space:
mode:
authorEd Maste <emaste@FreeBSD.org>2017-02-15 15:32:29 +0000
committerEd Maste <emaste@FreeBSD.org>2017-02-15 15:32:29 +0000
commit26ab9a178caaa405f466d98743ed7f11e2d81509 (patch)
tree08e429761840532549c03aeed280c8a782dc1f48 /contrib/tzcode
parent783b367605365687ea865468579ce9a41e451d17 (diff)
downloadsrc-26ab9a178caaa405f466d98743ed7f11e2d81509.tar.gz
src-26ab9a178caaa405f466d98743ed7f11e2d81509.zip
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
Notes
Notes: svn path=/head/; revision=313774
Diffstat (limited to 'contrib/tzcode')
-rw-r--r--contrib/tzcode/stdtime/localtime.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/contrib/tzcode/stdtime/localtime.c b/contrib/tzcode/stdtime/localtime.c
index ad9508240b97..632a8d4a89ba 100644
--- a/contrib/tzcode/stdtime/localtime.c
+++ b/contrib/tzcode/stdtime/localtime.c
@@ -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, struct tm *tmp)
{
_RWLOCK_RDLOCK(&lcl_rwlock);
tzset_basic(1);
- localsub(timep, 0L, tmp);
+ tmp = localsub(timep, 0L, tmp);
_RWLOCK_UNLOCK(&lcl_rwlock);
return tmp;
}