mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-01 06:55:30 +00:00
4668. [bug] Use localtime_r and gmtime_r for thread safety.
[RT #45664]
This commit is contained in:
3
CHANGES
3
CHANGES
@@ -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]
|
4667. [cleanup] Refactor RDATA unit tests. [RT #45610]
|
||||||
|
|
||||||
4666. [bug] dnssec-keymgr: Domain names beginning with digits (0-9)
|
4666. [bug] dnssec-keymgr: Domain names beginning with digits (0-9)
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
#include <isc/app.h>
|
#include <isc/app.h>
|
||||||
#include <isc/netaddr.h>
|
#include <isc/netaddr.h>
|
||||||
#include <isc/parseint.h>
|
#include <isc/parseint.h>
|
||||||
|
#include <isc/platform.h>
|
||||||
#include <isc/print.h>
|
#include <isc/print.h>
|
||||||
#include <isc/string.h>
|
#include <isc/string.h>
|
||||||
#include <isc/task.h>
|
#include <isc/task.h>
|
||||||
@@ -261,7 +262,12 @@ received(int bytes, isc_sockaddr_t *from, dig_query_t *query) {
|
|||||||
printf(";; Query time: %ld msec\n", (long) diff / 1000);
|
printf(";; Query time: %ld msec\n", (long) diff / 1000);
|
||||||
printf(";; SERVER: %s(%s)\n", fromtext, query->servname);
|
printf(";; SERVER: %s(%s)\n", fromtext, query->servname);
|
||||||
time(&tnow);
|
time(&tnow);
|
||||||
|
#if defined(ISC_PLATFORM_USETHREADS) && !defined(WIN32)
|
||||||
|
(void)localtime_r(&tnow, &tmnow);
|
||||||
|
#else
|
||||||
tmnow = *localtime(&tnow);
|
tmnow = *localtime(&tnow);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (strftime(time_str, sizeof(time_str),
|
if (strftime(time_str, sizeof(time_str),
|
||||||
"%a %b %d %H:%M:%S %Z %Y", &tmnow) > 0U)
|
"%a %b %d %H:%M:%S %Z %Y", &tmnow) > 0U)
|
||||||
printf(";; WHEN: %s\n", time_str);
|
printf(";; WHEN: %s\n", time_str);
|
||||||
|
@@ -14,6 +14,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
|
#include <isc/platform.h>
|
||||||
#include <isc/print.h>
|
#include <isc/print.h>
|
||||||
#include <isc/string.h>
|
#include <isc/string.h>
|
||||||
#include <isc/util.h>
|
#include <isc/util.h>
|
||||||
@@ -27,19 +28,22 @@
|
|||||||
const char *gettime(void);
|
const char *gettime(void);
|
||||||
const char *test_result_totext(test_result_t);
|
const char *test_result_totext(test_result_t);
|
||||||
|
|
||||||
/*
|
|
||||||
* Not thread safe.
|
|
||||||
*/
|
|
||||||
const char *
|
const char *
|
||||||
gettime(void) {
|
gettime(void) {
|
||||||
static char now[512];
|
static char now[512];
|
||||||
time_t t;
|
time_t t;
|
||||||
|
#if defined(ISC_PLATFORM_USETHREADS) && !defined(WIN32)
|
||||||
|
struct tm tm;
|
||||||
|
#endif
|
||||||
|
|
||||||
(void)time(&t);
|
(void)time(&t);
|
||||||
|
|
||||||
strftime(now, sizeof(now) - 1,
|
#if defined(ISC_PLATFORM_USETHREADS) && !defined(WIN32)
|
||||||
"%A %d %B %H:%M:%S %Y",
|
strftime(now, sizeof(now) - 1, "%A %d %B %H:%M:%S %Y",
|
||||||
localtime(&t));
|
localtime_r(&t, &tm));
|
||||||
|
#else
|
||||||
|
strftime(now, sizeof(now) - 1, "%A %d %B %H:%M:%S %Y", localtime(&t));
|
||||||
|
#endif
|
||||||
|
|
||||||
return (now);
|
return (now);
|
||||||
}
|
}
|
||||||
|
@@ -14,6 +14,7 @@
|
|||||||
#include <isc/magic.h>
|
#include <isc/magic.h>
|
||||||
#include <isc/mem.h>
|
#include <isc/mem.h>
|
||||||
#include <isc/netaddr.h>
|
#include <isc/netaddr.h>
|
||||||
|
#include <isc/platform.h>
|
||||||
#include <isc/print.h>
|
#include <isc/print.h>
|
||||||
#include <isc/serial.h>
|
#include <isc/serial.h>
|
||||||
#include <isc/stats.h>
|
#include <isc/stats.h>
|
||||||
@@ -2023,7 +2024,13 @@ dns_update_signaturesinc(dns_update_log_t *log, dns_zone_t *zone, dns_db_t *db,
|
|||||||
static isc_stdtime_t
|
static isc_stdtime_t
|
||||||
epoch_to_yyyymmdd(time_t when) {
|
epoch_to_yyyymmdd(time_t when) {
|
||||||
struct tm *tm;
|
struct tm *tm;
|
||||||
|
|
||||||
|
#if defined(ISC_PLATFORM_USETHREADS) && !defined(WIN32)
|
||||||
|
struct tm tm0;
|
||||||
|
tm = localtime_r(&when, &tm0);
|
||||||
|
#else
|
||||||
tm = localtime(&when);
|
tm = localtime(&when);
|
||||||
|
#endif
|
||||||
return (((tm->tm_year + 1900) * 10000) +
|
return (((tm->tm_year + 1900) * 10000) +
|
||||||
((tm->tm_mon + 1) * 100) + tm->tm_mday);
|
((tm->tm_mon + 1) * 100) + tm->tm_mday);
|
||||||
}
|
}
|
||||||
|
@@ -21,6 +21,7 @@
|
|||||||
#include <sys/time.h> /* Required for struct timeval on some platforms. */
|
#include <sys/time.h> /* Required for struct timeval on some platforms. */
|
||||||
|
|
||||||
#include <isc/log.h>
|
#include <isc/log.h>
|
||||||
|
#include <isc/platform.h>
|
||||||
#include <isc/print.h>
|
#include <isc/print.h>
|
||||||
#include <isc/strerror.h>
|
#include <isc/strerror.h>
|
||||||
#include <isc/string.h>
|
#include <isc/string.h>
|
||||||
@@ -376,11 +377,18 @@ void
|
|||||||
isc_time_formattimestamp(const isc_time_t *t, char *buf, unsigned int len) {
|
isc_time_formattimestamp(const isc_time_t *t, char *buf, unsigned int len) {
|
||||||
time_t now;
|
time_t now;
|
||||||
unsigned int flen;
|
unsigned int flen;
|
||||||
|
#ifdef ISC_PLATFORM_USETHREADS
|
||||||
|
struct tm tm;
|
||||||
|
#endif
|
||||||
|
|
||||||
REQUIRE(len > 0);
|
REQUIRE(len > 0);
|
||||||
|
|
||||||
now = (time_t) t->seconds;
|
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));
|
flen = strftime(buf, len, "%d-%b-%Y %X", localtime(&now));
|
||||||
|
#endif
|
||||||
INSIST(flen < len);
|
INSIST(flen < len);
|
||||||
if (flen != 0)
|
if (flen != 0)
|
||||||
snprintf(buf + flen, len - flen,
|
snprintf(buf + flen, len - flen,
|
||||||
@@ -395,6 +403,9 @@ void
|
|||||||
isc_time_formathttptimestamp(const isc_time_t *t, char *buf, unsigned int len) {
|
isc_time_formathttptimestamp(const isc_time_t *t, char *buf, unsigned int len) {
|
||||||
time_t now;
|
time_t now;
|
||||||
unsigned int flen;
|
unsigned int flen;
|
||||||
|
#ifdef ISC_PLATFORM_USETHREADS
|
||||||
|
struct tm tm;
|
||||||
|
#endif
|
||||||
|
|
||||||
REQUIRE(len > 0);
|
REQUIRE(len > 0);
|
||||||
|
|
||||||
@@ -402,7 +413,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+)
|
* 5 spaces, 1 comma, 3 GMT, 2 %d, 4 %Y, 8 %H:%M:%S, 3+ %a, 3+ %b (29+)
|
||||||
*/
|
*/
|
||||||
now = (time_t)t->seconds;
|
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));
|
flen = strftime(buf, len, "%a, %d %b %Y %H:%M:%S GMT", gmtime(&now));
|
||||||
|
#endif
|
||||||
INSIST(flen < len);
|
INSIST(flen < len);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -428,11 +444,18 @@ void
|
|||||||
isc_time_formatISO8601L(const isc_time_t *t, char *buf, unsigned int len) {
|
isc_time_formatISO8601L(const isc_time_t *t, char *buf, unsigned int len) {
|
||||||
time_t now;
|
time_t now;
|
||||||
unsigned int flen;
|
unsigned int flen;
|
||||||
|
#ifdef ISC_PLATFORM_USETHREADS
|
||||||
|
struct tm tm;
|
||||||
|
#endif
|
||||||
|
|
||||||
REQUIRE(len > 0);
|
REQUIRE(len > 0);
|
||||||
|
|
||||||
now = (time_t)t->seconds;
|
now = (time_t)t->seconds;
|
||||||
|
#ifdef ISC_PLATFORM_USETHREADS
|
||||||
|
flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%S", localtime_r(&now, &tm));
|
||||||
|
#else
|
||||||
flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%S", localtime(&now));
|
flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%S", localtime(&now));
|
||||||
|
#endif
|
||||||
INSIST(flen < len);
|
INSIST(flen < len);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -440,11 +463,18 @@ void
|
|||||||
isc_time_formatISO8601Lms(const isc_time_t *t, char *buf, unsigned int len) {
|
isc_time_formatISO8601Lms(const isc_time_t *t, char *buf, unsigned int len) {
|
||||||
time_t now;
|
time_t now;
|
||||||
unsigned int flen;
|
unsigned int flen;
|
||||||
|
#ifdef ISC_PLATFORM_USETHREADS
|
||||||
|
struct tm tm;
|
||||||
|
#endif
|
||||||
|
|
||||||
REQUIRE(len > 0);
|
REQUIRE(len > 0);
|
||||||
|
|
||||||
now = (time_t)t->seconds;
|
now = (time_t)t->seconds;
|
||||||
|
#ifdef ISC_PLATFORM_USETHREADS
|
||||||
|
flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%S", localtime_r(&now, &tm));
|
||||||
|
#else
|
||||||
flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%S", localtime(&now));
|
flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%S", localtime(&now));
|
||||||
|
#endif
|
||||||
INSIST(flen < len);
|
INSIST(flen < len);
|
||||||
if (flen > 0U && len - flen >= 6) {
|
if (flen > 0U && len - flen >= 6) {
|
||||||
snprintf(buf + flen, len - flen, ".%03u",
|
snprintf(buf + flen, len - flen, ".%03u",
|
||||||
@@ -456,11 +486,18 @@ void
|
|||||||
isc_time_formatISO8601(const isc_time_t *t, char *buf, unsigned int len) {
|
isc_time_formatISO8601(const isc_time_t *t, char *buf, unsigned int len) {
|
||||||
time_t now;
|
time_t now;
|
||||||
unsigned int flen;
|
unsigned int flen;
|
||||||
|
#ifdef ISC_PLATFORM_USETHREADS
|
||||||
|
struct tm tm;
|
||||||
|
#endif
|
||||||
|
|
||||||
REQUIRE(len > 0);
|
REQUIRE(len > 0);
|
||||||
|
|
||||||
now = (time_t)t->seconds;
|
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));
|
flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%SZ", gmtime(&now));
|
||||||
|
#endif
|
||||||
INSIST(flen < len);
|
INSIST(flen < len);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -468,11 +505,18 @@ void
|
|||||||
isc_time_formatISO8601ms(const isc_time_t *t, char *buf, unsigned int len) {
|
isc_time_formatISO8601ms(const isc_time_t *t, char *buf, unsigned int len) {
|
||||||
time_t now;
|
time_t now;
|
||||||
unsigned int flen;
|
unsigned int flen;
|
||||||
|
#ifdef ISC_PLATFORM_USETHREADS
|
||||||
|
struct tm tm;
|
||||||
|
#endif
|
||||||
|
|
||||||
REQUIRE(len > 0);
|
REQUIRE(len > 0);
|
||||||
|
|
||||||
now = (time_t)t->seconds;
|
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));
|
flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%SZ", gmtime(&now));
|
||||||
|
#endif
|
||||||
INSIST(flen < len);
|
INSIST(flen < len);
|
||||||
if (flen > 0U && len - flen >= 5) {
|
if (flen > 0U && len - flen >= 5) {
|
||||||
flen -= 1; /* rewind one character (Z) */
|
flen -= 1; /* rewind one character (Z) */
|
||||||
@@ -486,11 +530,18 @@ isc_time_formatshorttimestamp(const isc_time_t *t, char *buf, unsigned int len)
|
|||||||
{
|
{
|
||||||
time_t now;
|
time_t now;
|
||||||
unsigned int flen;
|
unsigned int flen;
|
||||||
|
#ifdef ISC_PLATFORM_USETHREADS
|
||||||
|
struct tm tm;
|
||||||
|
#endif
|
||||||
|
|
||||||
REQUIRE(len > 0);
|
REQUIRE(len > 0);
|
||||||
|
|
||||||
now = (time_t)t->seconds;
|
now = (time_t)t->seconds;
|
||||||
|
#ifdef ISC_PLATFORM_USETHREADS
|
||||||
|
flen = strftime(buf, len, "%Y%m%d%H%M%S", gmtime_r(&now, &tm));
|
||||||
|
#else
|
||||||
flen = strftime(buf, len, "%Y%m%d%H%M%S", gmtime(&now));
|
flen = strftime(buf, len, "%Y%m%d%H%M%S", gmtime(&now));
|
||||||
|
#endif
|
||||||
INSIST(flen < len);
|
INSIST(flen < len);
|
||||||
if (flen > 0U && len - flen >= 5) {
|
if (flen > 0U && len - flen >= 5) {
|
||||||
flen -= 1; /* rewind one character (Z) */
|
flen -= 1; /* rewind one character (Z) */
|
||||||
|
@@ -30,6 +30,7 @@
|
|||||||
|
|
||||||
#include <isc/boolean.h>
|
#include <isc/boolean.h>
|
||||||
#include <isc/commandline.h>
|
#include <isc/commandline.h>
|
||||||
|
#include <isc/platform.h>
|
||||||
#include <isc/print.h>
|
#include <isc/print.h>
|
||||||
#include <isc/string.h>
|
#include <isc/string.h>
|
||||||
#include <isc/mem.h>
|
#include <isc/mem.h>
|
||||||
@@ -596,9 +597,16 @@ t_getdate(char *buf, size_t buflen) {
|
|||||||
size_t n;
|
size_t n;
|
||||||
time_t t;
|
time_t t;
|
||||||
struct tm *p;
|
struct tm *p;
|
||||||
|
#if defined(ISC_PLATFORM_USETHREADS) && !defined(WIN32)
|
||||||
|
struct tm tm;
|
||||||
|
#endif
|
||||||
|
|
||||||
t = time(NULL);
|
t = time(NULL);
|
||||||
|
#if defined(ISC_PLATFORM_USETHREADS) && !defined(WIN32)
|
||||||
|
p = localtime_r(&t, &tm);
|
||||||
|
#else
|
||||||
p = localtime(&t);
|
p = localtime(&t);
|
||||||
|
#endif
|
||||||
n = strftime(buf, buflen - 1, "%A %d %B %H:%M:%S %Y\n", p);
|
n = strftime(buf, buflen - 1, "%A %d %B %H:%M:%S %Y\n", p);
|
||||||
return(n != 0U ? buf : NULL);
|
return(n != 0U ? buf : NULL);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user