diff --git a/CHANGES b/CHANGES
index f036f900ee..35e25a0e24 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+4044. [bug] Change 3955 was not complete, resulting in an assertion
+ failure if the timing was just right. [RT #38352]
+
4039. [cleanup] Cleaned up warnings from gcc -Wshadow. [RT #37381]
4038. [bug] Add 'rpz' flag to node and use it to determine whether
diff --git a/bin/named/win32/os.c b/bin/named/win32/os.c
index a38df60d15..240c4d188c 100644
--- a/bin/named/win32/os.c
+++ b/bin/named/win32/os.c
@@ -80,9 +80,10 @@ ns_paths_init(void) {
static void
version_check(const char *progname) {
- if(isc_win32os_majorversion() < 5)
+ if ((isc_win32os_versioncheck(4, 0, 0, 0) >= 0) &&
+ (isc_win32os_versioncheck(5, 0, 0, 0) < 0))
return; /* No problem with Version 4.0 */
- if(isc_win32os_versioncheck(5, 0, 2, 0) < 0)
+ if (isc_win32os_versioncheck(5, 0, 2, 0) < 0)
if (ntservice_isservice())
NTReportError(progname, version_error);
else
diff --git a/doc/arm/Bv9ARM-book.xml b/doc/arm/Bv9ARM-book.xml
index 3a585231fc..55b661f834 100644
--- a/doc/arm/Bv9ARM-book.xml
+++ b/doc/arm/Bv9ARM-book.xml
@@ -4982,16 +4982,16 @@ badresp:1,adberr:0,findfail:0,valfail:0]
min-table-size number ;
} ;
response-policy {
- zone zone_name ;
- policy given | disabled | passthru | drop | nxdomain | nodata | cname domain
- recursive-only yes_or_no
- max-policy-ttl number ; ;
- }
+ zone zone_name
+ policy (given | disabled | passthru | drop |
+ nxdomain | nodata | cname domain)
recursive-only yes_or_no
max-policy-ttl number
break-dnssec yes_or_no
min-ns-dots number
- qname-wait-recurse yes_or_no ;
+ qname-wait-recurse yes_or_no
+ ; ...
+ } ;
};
diff --git a/lib/bind9/check.c b/lib/bind9/check.c
index 94c0f64662..1b90b58313 100644
--- a/lib/bind9/check.c
+++ b/lib/bind9/check.c
@@ -805,7 +805,9 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx,
dns_fixedname_t fixed;
const char *str;
dns_name_t *name;
+#ifdef ISC_PLATFORM_USESIT
isc_buffer_t b;
+#endif
static intervaltable intervals[] = {
{ "cleaning-interval", 60, 28 * 24 * 60 }, /* 28 days */
diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c
index a48bf25388..65228dca1f 100644
--- a/lib/dns/rbtdb.c
+++ b/lib/dns/rbtdb.c
@@ -2378,7 +2378,6 @@ setnsec3parameters(dns_db_t *db, rbtdb_version_t *version) {
unsigned int count, length;
dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db;
- RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
version->havensec3 = ISC_FALSE;
node = rbtdb->origin_node;
NODE_LOCK(&(rbtdb->node_locks[node->locknum].lock),
@@ -2455,7 +2454,6 @@ setnsec3parameters(dns_db_t *db, rbtdb_version_t *version) {
unlock:
NODE_UNLOCK(&(rbtdb->node_locks[node->locknum].lock),
isc_rwlocktype_read);
- RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
}
static void
@@ -2576,6 +2574,11 @@ closeversion(dns_db_t *db, dns_dbversion_t **versionp, isc_boolean_t commit) {
cleanup_version->changed_list,
link);
}
+ /*
+ * Update the zone's secure status.
+ */
+ if (!IS_CACHE(rbtdb))
+ iszonesecure(db, version, rbtdb->origin_node);
/*
* Become the current version.
*/
@@ -2654,12 +2657,6 @@ closeversion(dns_db_t *db, dns_dbversion_t **versionp, isc_boolean_t commit) {
least_serial = rbtdb->least_serial;
RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write);
- /*
- * Update the zone's secure status.
- */
- if (writer && commit && !IS_CACHE(rbtdb))
- iszonesecure(db, version, rbtdb->origin_node);
-
if (cleanup_version != NULL) {
INSIST(EMPTY(cleanup_version->changed_list));
isc_mem_put(rbtdb->common.mctx, cleanup_version,
diff --git a/lib/isc/ratelimiter.c b/lib/isc/ratelimiter.c
index 1d78710def..96571e1ca4 100644
--- a/lib/isc/ratelimiter.c
+++ b/lib/isc/ratelimiter.c
@@ -154,8 +154,8 @@ isc_ratelimiter_enqueue(isc_ratelimiter_t *rl, isc_task_t *task,
if (rl->state == isc_ratelimiter_ratelimited ||
rl->state == isc_ratelimiter_stalled) {
ev->ev_sender = task;
- ISC_LIST_APPEND(rl->pending, ev, ev_link);
*eventp = NULL;
+ ISC_LIST_APPEND(rl->pending, ev, ev_link);
} else if (rl->state == isc_ratelimiter_idle) {
result = isc_timer_reset(rl->timer, isc_timertype_ticker, NULL,
&rl->interval, ISC_FALSE);
@@ -181,9 +181,10 @@ isc_ratelimiter_dequeue(isc_ratelimiter_t *rl, isc_event_t *event) {
REQUIRE(event != NULL);
LOCK(&rl->lock);
- if (ISC_LINK_LINKED(event, ev_link))
+ if (ISC_LINK_LINKED(event, ev_link)) {
ISC_LIST_UNLINK(rl->pending, event, ev_link);
- else
+ event->ev_sender = NULL;
+ } else
result = ISC_R_NOTFOUND;
UNLOCK(&rl->lock);
return (result);
diff --git a/lib/isc/win32/include/isc/win32os.h b/lib/isc/win32/include/isc/win32os.h
index bd40393619..34978fd414 100644
--- a/lib/isc/win32/include/isc/win32os.h
+++ b/lib/isc/win32/include/isc/win32os.h
@@ -29,30 +29,6 @@ ISC_LANG_BEGINDECLS
* be determined.
*/
-unsigned int
-isc_win32os_majorversion(void);
-/*
- * Major Version of the O/S.
- */
-
-unsigned int
-isc_win32os_minorversion(void);
-/*
- * Minor Version of the O/S.
- */
-
-unsigned int
-isc_win32os_servicepackmajor(void);
-/*
- * Major Version of the Service Pack for O/S.
- */
-
-unsigned int
-isc_win32os_servicepackminor(void);
-/*
- * Minor Version of the Service Pack for O/S.
- */
-
int
isc_win32os_versioncheck(unsigned int major, unsigned int minor,
unsigned int updatemajor, unsigned int updateminor);
diff --git a/lib/isc/win32/libisc.def.in b/lib/isc/win32/libisc.def.in
index 49a8e6aca5..7f72aed8f8 100644
--- a/lib/isc/win32/libisc.def.in
+++ b/lib/isc/win32/libisc.def.in
@@ -729,10 +729,6 @@ isc_timermgr_destroy
isc_timermgr_poke
isc_tm_timegm
isc_tm_strptime
-isc_win32os_majorversion
-isc_win32os_minorversion
-isc_win32os_servicepackmajor
-isc_win32os_servicepackminor
isc_win32os_versioncheck
openlog
@IF PKCS11
diff --git a/lib/isc/win32/socket.c b/lib/isc/win32/socket.c
index e50c0a0607..1e078fb67a 100644
--- a/lib/isc/win32/socket.c
+++ b/lib/isc/win32/socket.c
@@ -927,7 +927,7 @@ connection_reset_fix(SOCKET fd) {
BOOL bNewBehavior = FALSE;
DWORD status;
- if (isc_win32os_majorversion() < 5)
+ if (isc_win32os_versioncheck(5, 0, 0, 0) < 0)
return (ISC_R_SUCCESS); /* NT 4.0 has no problem */
/* disable bad behavior using IOCTL: SIO_UDP_CONNRESET */
diff --git a/lib/isc/win32/win32os.c b/lib/isc/win32/win32os.c
index 74c6ea4186..c02dfc6016 100644
--- a/lib/isc/win32/win32os.c
+++ b/lib/isc/win32/win32os.c
@@ -15,88 +15,106 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: win32os.c,v 1.5 2007/06/19 23:47:19 tbox Exp $ */
-
#include
+#ifndef TESTVERSION
#include
-
-static BOOL bInit = FALSE;
-static OSVERSIONINFOEX osVer;
-
-static void
-initialize_action(void) {
- BOOL bSuccess;
-
- if (bInit)
- return;
- /*
- * NOTE: VC++ 6.0 gets this function declaration wrong
- * so we compensate by casting the argument
- * NOTE: GetVersionEx() deprecated in Windows 8.1
- */
- osVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
- bSuccess = GetVersionEx((OSVERSIONINFO *) &osVer);
-
- /*
- * Versions of NT before NT4.0 SP6 did not return the
- * extra info that the EX structure provides and returns
- * a failure so we need to retry with the old structure.
- */
- if(!bSuccess) {
- osVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
- (void)GetVersionEx((OSVERSIONINFO *) &osVer);
- }
- bInit = TRUE;
-}
-
-unsigned int
-isc_win32os_majorversion(void) {
- initialize_action();
- return ((unsigned int)osVer.dwMajorVersion);
-}
-
-unsigned int
-isc_win32os_minorversion(void) {
- initialize_action();
- return ((unsigned int)osVer.dwMinorVersion);
-}
-
-unsigned int
-isc_win32os_servicepackmajor(void) {
- initialize_action();
- return ((unsigned int)osVer.wServicePackMajor);
-}
-
-unsigned int
-isc_win32os_servicepackminor(void) {
- initialize_action();
- return ((unsigned int)osVer.wServicePackMinor);
-}
+#else
+#include
+#endif
int
isc_win32os_versioncheck(unsigned int major, unsigned int minor,
- unsigned int spmajor, unsigned int spminor) {
+ unsigned int spmajor, unsigned int spminor)
+{
+ OSVERSIONINFOEX osVer;
+ DWORD typeMask;
+ ULONGLONG conditionMask;
- initialize_action();
+ memset(&osVer, 0, sizeof(OSVERSIONINFOEX));
+ osVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+ typeMask = 0;
+ conditionMask = 0;
- if (major < isc_win32os_majorversion())
+ /* Optimistic: likely greater */
+ osVer.dwMajorVersion = major;
+ typeMask |= VER_MAJORVERSION;
+ conditionMask = VerSetConditionMask(conditionMask,
+ VER_MAJORVERSION,
+ VER_GREATER);
+ osVer.dwMinorVersion = minor;
+ typeMask |= VER_MINORVERSION;
+ conditionMask = VerSetConditionMask(conditionMask,
+ VER_MINORVERSION,
+ VER_GREATER);
+ osVer.wServicePackMajor = spmajor;
+ typeMask |= VER_SERVICEPACKMAJOR;
+ conditionMask = VerSetConditionMask(conditionMask,
+ VER_SERVICEPACKMAJOR,
+ VER_GREATER);
+ osVer.wServicePackMinor = spminor;
+ typeMask |= VER_SERVICEPACKMINOR;
+ conditionMask = VerSetConditionMask(conditionMask,
+ VER_SERVICEPACKMINOR,
+ VER_GREATER);
+ if (VerifyVersionInfo(&osVer, typeMask, conditionMask))
return (1);
- if (major > isc_win32os_majorversion())
- return (-1);
- if (minor < isc_win32os_minorversion())
- return (1);
- if (minor > isc_win32os_minorversion())
- return (-1);
- if (spmajor < isc_win32os_servicepackmajor())
- return (1);
- if (spmajor > isc_win32os_servicepackmajor())
- return (-1);
- if (spminor < isc_win32os_servicepackminor())
- return (1);
- if (spminor > isc_win32os_servicepackminor())
- return (-1);
- /* Exact */
- return (0);
+ /* Failed: retry with equal */
+ conditionMask = 0;
+ conditionMask = VerSetConditionMask(conditionMask,
+ VER_MAJORVERSION,
+ VER_EQUAL);
+ conditionMask = VerSetConditionMask(conditionMask,
+ VER_MINORVERSION,
+ VER_EQUAL);
+ conditionMask = VerSetConditionMask(conditionMask,
+ VER_SERVICEPACKMAJOR,
+ VER_EQUAL);
+ conditionMask = VerSetConditionMask(conditionMask,
+ VER_SERVICEPACKMINOR,
+ VER_EQUAL);
+ if (VerifyVersionInfo(&osVer, typeMask, conditionMask))
+ return (0);
+ else
+ return (-1);
}
+
+#ifdef TESTVERSION
+int
+main(int argc, char **argv) {
+ unsigned int major = 0;
+ unsigned int minor = 0;
+ unsigned int spmajor = 0;
+ unsigned int spminor = 0;
+ int ret;
+
+ if (argc > 1) {
+ --argc;
+ ++argv;
+ major = (unsigned int) atoi(argv[0]);
+ }
+ if (argc > 1) {
+ --argc;
+ ++argv;
+ minor = (unsigned int) atoi(argv[0]);
+ }
+ if (argc > 1) {
+ --argc;
+ ++argv;
+ spmajor = (unsigned int) atoi(argv[0]);
+ }
+ if (argc > 1) {
+ --argc;
+ ++argv;
+ spminor = (unsigned int) atoi(argv[0]);
+ }
+
+ ret = isc_win32os_versioncheck(major, minor, spmajor, spminor);
+
+ printf("%s major %u minor %u SP major %u SP minor %u\n",
+ ret > 0 ? "greater" : (ret == 0 ? "equal" : "less"),
+ major, minor, spmajor, spminor);
+ return (ret);
+}
+#endif
diff --git a/util/copyrights b/util/copyrights
index c354162333..4ecef3bd13 100644
--- a/util/copyrights
+++ b/util/copyrights
@@ -300,7 +300,7 @@
./bin/named/win32/named.vcxproj.in X 2013,2014
./bin/named/win32/named.vcxproj.user X 2013
./bin/named/win32/ntservice.c C 1999,2000,2001,2002,2004,2006,2007,2009,2011,2013,2014
-./bin/named/win32/os.c C 1999,2000,2001,2002,2004,2005,2007,2008,2009,2012,2013,2014
+./bin/named/win32/os.c C 1999,2000,2001,2002,2004,2005,2007,2008,2009,2012,2013,2014,2015
./bin/named/xfrout.c C 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014
./bin/named/zoneconf.c C 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015
./bin/nsupdate/.gitignore X 2012
@@ -3664,14 +3664,14 @@
./lib/isc/win32/include/isc/syslog.h C 1999,2000,2001,2004,2007
./lib/isc/win32/include/isc/thread.h C 1998,1999,2000,2001,2004,2005,2007,2009,2013
./lib/isc/win32/include/isc/time.h C 1998,1999,2000,2001,2004,2006,2007,2008,2009,2012,2014
-./lib/isc/win32/include/isc/win32os.h C 2002,2004,2007,2009
+./lib/isc/win32/include/isc/win32os.h C 2002,2004,2007,2009,2015
./lib/isc/win32/include/pkcs11/Makefile.in MAKE 2014
./lib/isc/win32/include/pkcs11/cryptoki.h X 2014
./lib/isc/win32/interfaceiter.c C 1999,2000,2001,2004,2007,2008,2009,2013,2014
./lib/isc/win32/ipv6.c C 1999,2000,2001,2004,2007
./lib/isc/win32/keyboard.c C 2000,2001,2004,2007
./lib/isc/win32/libgen.h C 2009
-./lib/isc/win32/libisc.def.in X 2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014
+./lib/isc/win32/libisc.def.in X 2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015
./lib/isc/win32/libisc.dsp.in X 2001,2002,2003,2004,2005,2006,2007,2008,2009,2013,2014
./lib/isc/win32/libisc.dsw X 2001
./lib/isc/win32/libisc.mak.in X 2001,2002,2003,2004,2005,2006,2007,2008,2009,2013,2014
@@ -3686,7 +3686,7 @@
./lib/isc/win32/os.c C 2000,2001,2002,2004,2007,2013
./lib/isc/win32/pk11_api.c C 2014
./lib/isc/win32/resource.c C 2000,2001,2004,2007,2008
-./lib/isc/win32/socket.c C 2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014
+./lib/isc/win32/socket.c C 2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015
./lib/isc/win32/stdio.c C 2000,2001,2004,2007,2013
./lib/isc/win32/stdtime.c C 1999,2000,2001,2004,2007,2013
./lib/isc/win32/strerror.c C 2001,2002,2004,2007
@@ -3696,7 +3696,7 @@
./lib/isc/win32/time.c C 1998,1999,2000,2001,2003,2004,2006,2007,2008,2009,2012,2013,2014
./lib/isc/win32/unistd.h C 2000,2001,2004,2007,2008,2009
./lib/isc/win32/version.c C 1998,1999,2000,2001,2004,2007
-./lib/isc/win32/win32os.c C 2002,2004,2007,2013,2014
+./lib/isc/win32/win32os.c C 2002,2004,2007,2013,2014,2015
./lib/isc/x86_32/Makefile.in MAKE 2007,2012
./lib/isc/x86_32/include/Makefile.in MAKE 2007,2012
./lib/isc/x86_32/include/isc/Makefile.in MAKE 2007,2012