diff --git a/CHANGES b/CHANGES index f5e7c40214..583b90a834 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +4524. [bug] The net zero test was broken causing IPv4 servers + with addresses ending in .0 to be rejected. [RT #43776] + 4523. [doc] Expand config doc for and . [RT #43768] diff --git a/lib/isc/netaddr.c b/lib/isc/netaddr.c index a41baa2775..c60afbb297 100644 --- a/lib/isc/netaddr.c +++ b/lib/isc/netaddr.c @@ -418,15 +418,15 @@ isc_netaddr_issitelocal(isc_netaddr_t *na) { } } -#ifndef IN_ZERONET -#define IN_ZERONET(x) (((x) & htonl(0xff000000U)) == 0) -#endif +#define ISC_IPADDR_ISNETZERO(i) \ + (((isc_uint32_t)(i) & ISC__IPADDR(0xff000000)) \ + == ISC__IPADDR(0x00000000)) isc_boolean_t isc_netaddr_isnetzero(isc_netaddr_t *na) { switch (na->family) { case AF_INET: - return (ISC_TF(IN_ZERONET(na->type.in.s_addr))); + return (ISC_TF(ISC_IPADDR_ISNETZERO(na->type.in.s_addr))); case AF_INET6: return (ISC_FALSE); default: diff --git a/lib/isc/tests/Makefile.in b/lib/isc/tests/Makefile.in index ab78ffc4e1..98f275c9a8 100644 --- a/lib/isc/tests/Makefile.in +++ b/lib/isc/tests/Makefile.in @@ -39,7 +39,8 @@ SRCS = isctest.c taskpool_test.c socket_test.c hash_test.c \ lex_test.c radix_test.c \ sockaddr_test.c symtab_test.c task_test.c queue_test.c \ parse_test.c pool_test.c print_test.c regex_test.c \ - safe_test.c time_test.c counter_test.c errno_test.c + safe_test.c time_test.c counter_test.c errno_test.c \ + netaddr_test.c SUBDIRS = TARGETS = taskpool_test@EXEEXT@ socket_test@EXEEXT@ hash_test@EXEEXT@ \ @@ -48,7 +49,7 @@ TARGETS = taskpool_test@EXEEXT@ socket_test@EXEEXT@ hash_test@EXEEXT@ \ queue_test@EXEEXT@ parse_test@EXEEXT@ pool_test@EXEEXT@ \ print_test@EXEEXT@ regex_test@EXEEXT@ socket_test@EXEEXT@ \ safe_test@EXEEXT@ time_test@EXEEXT@ counter_test@EXEEXT@ \ - errno_test@EXEEXT@ + errno_test@EXEEXT@ netaddr_test@EXEEXT@ @BIND9_MAKE_RULES@ @@ -121,6 +122,10 @@ errno_test@EXEEXT@: errno_test.@O@ ${ISCDEPLIBS} ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \ errno_test.@O@ ${ISCLIBS} ${LIBS} +netaddr_test@EXEEXT@: netaddr_test.@O@ ${ISCDEPLIBS} + ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \ + netaddr_test.@O@ ${ISCLIBS} ${LIBS} + unit:: sh ${top_srcdir}/unit/unittest.sh diff --git a/lib/isc/tests/netaddr_test.c b/lib/isc/tests/netaddr_test.c new file mode 100644 index 0000000000..767bb32473 --- /dev/null +++ b/lib/isc/tests/netaddr_test.c @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2016 Internet Systems Consortium, Inc. ("ISC") + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +/* ! \file */ + +#include + +#include + +#include +#include + +#include + +ATF_TC(isc_netaddr_isnetzero); +ATF_TC_HEAD(isc_netaddr_isnetzero, tc) { + atf_tc_set_md_var(tc, "descr", "test isc_netaddr_isnetzero"); +} +ATF_TC_BODY(isc_netaddr_isnetzero, tc) { + unsigned int i; + struct in_addr ina; + struct { + const char *address; + isc_boolean_t expect; + } tests[] = { + { "0.0.0.0", ISC_TRUE }, + { "0.0.0.1", ISC_TRUE }, + { "0.0.1.2", ISC_TRUE }, + { "0.1.2.3", ISC_TRUE }, + { "10.0.0.0", ISC_FALSE }, + { "10.9.0.0", ISC_FALSE }, + { "10.9.8.0", ISC_FALSE }, + { "10.9.8.7", ISC_FALSE }, + { "127.0.0.0", ISC_FALSE }, + { "127.0.0.1", ISC_FALSE } + }; + isc_boolean_t result; + isc_netaddr_t netaddr; + + for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) { + ina.s_addr = inet_addr(tests[i].address); + isc_netaddr_fromin(&netaddr, &ina); + result = isc_netaddr_isnetzero(&netaddr); + ATF_CHECK_EQ_MSG(result, tests[i].expect, + "%s", tests[i].address); + } +} + +/* + * Main + */ +ATF_TP_ADD_TCS(tp) { + + ATF_TP_ADD_TC(tp, isc_netaddr_isnetzero); + + return (atf_no_error()); +}