4668. [bug] Use localtime_r and gmtime_r for thread safety.

[RT #45664]

(cherry picked from commit 2019cf29e2)
This commit is contained in:
Mark Andrews 2017-08-03 08:42:27 +10:00
parent 1a42ac0001
commit b5b0fbc44c
6 changed files with 68 additions and 6 deletions

View file

@ -1,3 +1,6 @@
4668. [bug] Use localtime_r and gmtime_r for thread safety.
[RT #45664]
4667. [cleanup] Refactor RDATA unit tests. [RT #45610]
4665. [protocol] Added support for ED25519 and ED448 DNSSEC signing

View file

@ -27,6 +27,7 @@
#include <isc/app.h>
#include <isc/netaddr.h>
#include <isc/parseint.h>
#include <isc/platform.h>
#include <isc/print.h>
#include <isc/string.h>
#include <isc/util.h>
@ -263,7 +264,12 @@ received(int bytes, isc_sockaddr_t *from, dig_query_t *query) {
printf(";; Query time: %ld msec\n", (long int)diff/1000);
printf(";; SERVER: %s(%s)\n", fromtext, query->servname);
time(&tnow);
#if defined(ISC_PLATFORM_USETHREADS) && !defined(WIN32)
(void)localtime_r(&tnow, &tmnow);
#else
tmnow = *localtime(&tnow);
#endif
if (strftime(time_str, sizeof(time_str),
"%a %b %d %H:%M:%S %Z %Y", &tmnow) > 0U)
printf(";; WHEN: %s\n", time_str);

View file

@ -23,6 +23,7 @@
#include <stdio.h>
#include <time.h>
#include <isc/platform.h>
#include <isc/print.h>
#include <isc/string.h>
#include <isc/util.h>
@ -36,19 +37,22 @@
const char *gettime(void);
const char *test_result_totext(test_result_t);
/*
* Not thread safe.
*/
const char *
gettime(void) {
static char now[512];
time_t t;
#if defined(ISC_PLATFORM_USETHREADS) && !defined(WIN32)
struct tm tm;
#endif
(void)time(&t);
strftime(now, sizeof(now) - 1,
"%A %d %B %H:%M:%S %Y",
localtime(&t));
#if defined(ISC_PLATFORM_USETHREADS) && !defined(WIN32)
strftime(now, sizeof(now) - 1, "%A %d %B %H:%M:%S %Y",
localtime_r(&t, &tm));
#else
strftime(now, sizeof(now) - 1, "%A %d %B %H:%M:%S %Y", localtime(&t));
#endif
return (now);
}

View file

@ -22,6 +22,7 @@
#include <isc/magic.h>
#include <isc/mem.h>
#include <isc/netaddr.h>
#include <isc/platform.h>
#include <isc/print.h>
#include <isc/serial.h>
#include <isc/stats.h>
@ -2027,6 +2028,23 @@ dns_update_signaturesinc(dns_update_log_t *log, dns_zone_t *zone, dns_db_t *db,
return (result);
}
<<<<<<< HEAD
=======
static isc_stdtime_t
epoch_to_yyyymmdd(time_t when) {
struct tm *tm;
#if defined(ISC_PLATFORM_USETHREADS) && !defined(WIN32)
struct tm tm0;
tm = localtime_r(&when, &tm0);
#else
tm = localtime(&when);
#endif
return (((tm->tm_year + 1900) * 10000) +
((tm->tm_mon + 1) * 100) + tm->tm_mday);
}
>>>>>>> 4162d3b36d... 4668. [bug] Use localtime_r and gmtime_r for thread safety.
isc_uint32_t
dns_update_soaserial(isc_uint32_t serial, dns_updatemethod_t method) {
isc_stdtime_t now;

View file

@ -30,6 +30,7 @@
#include <sys/time.h> /* Required for struct timeval on some platforms. */
#include <isc/log.h>
#include <isc/platform.h>
#include <isc/print.h>
#include <isc/strerror.h>
#include <isc/string.h>
@ -384,11 +385,18 @@ void
isc_time_formattimestamp(const isc_time_t *t, char *buf, unsigned int len) {
time_t now;
unsigned int flen;
#ifdef ISC_PLATFORM_USETHREADS
struct tm tm;
#endif
REQUIRE(len > 0);
now = (time_t) t->seconds;
#ifdef ISC_PLATFORM_USETHREADS
flen = strftime(buf, len, "%d-%b-%Y %X", localtime_r(&now, &tm));
#else
flen = strftime(buf, len, "%d-%b-%Y %X", localtime(&now));
#endif
INSIST(flen < len);
if (flen != 0)
snprintf(buf + flen, len - flen,
@ -401,6 +409,9 @@ void
isc_time_formathttptimestamp(const isc_time_t *t, char *buf, unsigned int len) {
time_t now;
unsigned int flen;
#ifdef ISC_PLATFORM_USETHREADS
struct tm tm;
#endif
REQUIRE(len > 0);
@ -408,7 +419,12 @@ isc_time_formathttptimestamp(const isc_time_t *t, char *buf, unsigned int len) {
* 5 spaces, 1 comma, 3 GMT, 2 %d, 4 %Y, 8 %H:%M:%S, 3+ %a, 3+ %b (29+)
*/
now = (time_t)t->seconds;
#ifdef ISC_PLATFORM_USETHREADS
flen = strftime(buf, len, "%a, %d %b %Y %H:%M:%S GMT",
gmtime_r(&now, &tm));
#else
flen = strftime(buf, len, "%a, %d %b %Y %H:%M:%S GMT", gmtime(&now));
#endif
INSIST(flen < len);
}
@ -434,10 +450,17 @@ void
isc_time_formatISO8601(const isc_time_t *t, char *buf, unsigned int len) {
time_t now;
unsigned int flen;
#ifdef ISC_PLATFORM_USETHREADS
struct tm tm;
#endif
REQUIRE(len > 0);
now = (time_t)t->seconds;
#ifdef ISC_PLATFORM_USETHREADS
flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%SZ", gmtime_r(&now, &tm));
#else
flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%SZ", gmtime(&now));
#endif
INSIST(flen < len);
}

View file

@ -39,6 +39,7 @@
#include <isc/boolean.h>
#include <isc/commandline.h>
#include <isc/platform.h>
#include <isc/print.h>
#include <isc/string.h>
#include <isc/mem.h>
@ -605,9 +606,16 @@ t_getdate(char *buf, size_t buflen) {
size_t n;
time_t t;
struct tm *p;
#if defined(ISC_PLATFORM_USETHREADS) && !defined(WIN32)
struct tm tm;
#endif
t = time(NULL);
#if defined(ISC_PLATFORM_USETHREADS) && !defined(WIN32)
p = localtime_r(&t, &tm);
#else
p = localtime(&t);
#endif
n = strftime(buf, buflen - 1, "%A %d %B %H:%M:%S %Y\n", p);
return(n != 0U ? buf : NULL);
}