From: Mark Andrews Date: Thu, 12 Sep 2024 02:54:25 +0000 (+1000) Subject: Add missing locks when returning addresses X-Git-Tag: v9.18.36~17^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=89e76eec70f2727555337bfa7c398146971085a8;p=thirdparty%2Fbind9.git Add missing locks when returning addresses Add missing locks in dns_zone_getxfrsource4 et al. Addresses CID 468706, 468708, 468741, 468742, 468785 and 468778. Cleanup dns_zone_setxfrsource4 et al to now return void. Remove double copies with dns_zone_getprimaryaddr and dns_zone_getsourceaddr. (cherry picked from commit d0a59277fb13023d3aff5c1d4d91506a850365ee) --- diff --git a/bin/named/zoneconf.c b/bin/named/zoneconf.c index c15e6c73377..c3cfbe8a98f 100644 --- a/bin/named/zoneconf.c +++ b/bin/named/zoneconf.c @@ -1302,30 +1302,28 @@ named_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, obj = NULL; result = named_config_get(maps, "parental-source", &obj); INSIST(result == ISC_R_SUCCESS && obj != NULL); - - CHECK(dns_zone_setparentalsrc4(zone, cfg_obj_assockaddr(obj))); + dns_zone_setparentalsrc4(zone, cfg_obj_assockaddr(obj)); named_add_reserved_dispatch(named_g_server, cfg_obj_assockaddr(obj)); obj = NULL; result = named_config_get(maps, "parental-source-v6", &obj); INSIST(result == ISC_R_SUCCESS && obj != NULL); - - CHECK(dns_zone_setparentalsrc6(zone, cfg_obj_assockaddr(obj))); + dns_zone_setparentalsrc6(zone, cfg_obj_assockaddr(obj)); named_add_reserved_dispatch(named_g_server, cfg_obj_assockaddr(obj)); obj = NULL; result = named_config_get(maps, "notify-source", &obj); INSIST(result == ISC_R_SUCCESS && obj != NULL); - CHECK(dns_zone_setnotifysrc4(zone, cfg_obj_assockaddr(obj))); + dns_zone_setnotifysrc4(zone, cfg_obj_assockaddr(obj)); named_add_reserved_dispatch(named_g_server, cfg_obj_assockaddr(obj)); obj = NULL; result = named_config_get(maps, "notify-source-v6", &obj); INSIST(result == ISC_R_SUCCESS && obj != NULL); - CHECK(dns_zone_setnotifysrc6(zone, cfg_obj_assockaddr(obj))); + dns_zone_setnotifysrc6(zone, cfg_obj_assockaddr(obj)); named_add_reserved_dispatch(named_g_server, cfg_obj_assockaddr(obj)); @@ -1956,29 +1954,26 @@ named_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, obj = NULL; result = named_config_get(maps, "transfer-source", &obj); INSIST(result == ISC_R_SUCCESS && obj != NULL); - CHECK(dns_zone_setxfrsource4(mayberaw, - cfg_obj_assockaddr(obj))); + dns_zone_setxfrsource4(mayberaw, cfg_obj_assockaddr(obj)); named_add_reserved_dispatch(named_g_server, cfg_obj_assockaddr(obj)); obj = NULL; result = named_config_get(maps, "transfer-source-v6", &obj); INSIST(result == ISC_R_SUCCESS && obj != NULL); - CHECK(dns_zone_setxfrsource6(mayberaw, - cfg_obj_assockaddr(obj))); + dns_zone_setxfrsource6(mayberaw, cfg_obj_assockaddr(obj)); named_add_reserved_dispatch(named_g_server, cfg_obj_assockaddr(obj)); obj = NULL; result = named_config_get(maps, "alt-transfer-source", &obj); INSIST(result == ISC_R_SUCCESS && obj != NULL); - CHECK(dns_zone_setaltxfrsource4(mayberaw, - cfg_obj_assockaddr(obj))); + dns_zone_setaltxfrsource4(mayberaw, cfg_obj_assockaddr(obj)); + obj = NULL; result = named_config_get(maps, "alt-transfer-source-v6", &obj); INSIST(result == ISC_R_SUCCESS && obj != NULL); - CHECK(dns_zone_setaltxfrsource6(mayberaw, - cfg_obj_assockaddr(obj))); + dns_zone_setaltxfrsource6(mayberaw, cfg_obj_assockaddr(obj)); obj = NULL; (void)named_config_get(maps, "use-alt-transfer-source", &obj); if (obj == NULL) { diff --git a/lib/dns/include/dns/zone.h b/lib/dns/include/dns/zone.h index 9c63e8848ca..2a338fe35f2 100644 --- a/lib/dns/include/dns/zone.h +++ b/lib/dns/include/dns/zone.h @@ -888,9 +888,9 @@ dns_zone_setmaxretrytime(dns_zone_t *zone, uint32_t val); * val > 0. */ -isc_result_t +void dns_zone_setxfrsource4(dns_zone_t *zone, const isc_sockaddr_t *xfrsource); -isc_result_t +void dns_zone_setaltxfrsource4(dns_zone_t *zone, const isc_sockaddr_t *xfrsource); /*%< * Set the source address to be used in IPv4 zone transfers. @@ -898,26 +898,24 @@ dns_zone_setaltxfrsource4(dns_zone_t *zone, const isc_sockaddr_t *xfrsource); * Require: *\li 'zone' to be a valid zone. *\li 'xfrsource' to contain the address. - * - * Returns: - *\li #ISC_R_SUCCESS */ -isc_sockaddr_t * -dns_zone_getxfrsource4(dns_zone_t *zone); -isc_sockaddr_t * -dns_zone_getaltxfrsource4(dns_zone_t *zone); +void +dns_zone_getxfrsource4(dns_zone_t *zone, isc_sockaddr_t *xfrsource); +void +dns_zone_getaltxfrsource4(dns_zone_t *zone, isc_sockaddr_t *xfrsource); /*%< * Returns the source address set by a previous dns_zone_setxfrsource4 * call, or the default of inaddr_any, port 0. * * Require: *\li 'zone' to be a valid zone. + *\li 'xfrsource' to not be NULL */ -isc_result_t +void dns_zone_setxfrsource6(dns_zone_t *zone, const isc_sockaddr_t *xfrsource); -isc_result_t +void dns_zone_setaltxfrsource6(dns_zone_t *zone, const isc_sockaddr_t *xfrsource); /*%< * Set the source address to be used in IPv6 zone transfers. @@ -925,24 +923,22 @@ dns_zone_setaltxfrsource6(dns_zone_t *zone, const isc_sockaddr_t *xfrsource); * Require: *\li 'zone' to be a valid zone. *\li 'xfrsource' to contain the address. - * - * Returns: - *\li #ISC_R_SUCCESS */ -isc_sockaddr_t * -dns_zone_getxfrsource6(dns_zone_t *zone); -isc_sockaddr_t * -dns_zone_getaltxfrsource6(dns_zone_t *zone); +void +dns_zone_getxfrsource6(dns_zone_t *zone, isc_sockaddr_t *xfrsource); +void +dns_zone_getaltxfrsource6(dns_zone_t *zone, isc_sockaddr_t *xfrsource); /*%< * Returns the source address set by a previous dns_zone_setxfrsource6 * call, or the default of in6addr_any, port 0. * * Require: *\li 'zone' to be a valid zone. + *\li 'xfrsource' to not be NULL */ -isc_result_t +void dns_zone_setparentalsrc4(dns_zone_t *zone, const isc_sockaddr_t *parentalsrc); /*%< * Set the source address to be used with IPv4 parental DS queries. @@ -950,22 +946,20 @@ dns_zone_setparentalsrc4(dns_zone_t *zone, const isc_sockaddr_t *parentalsrc); * Require: *\li 'zone' to be a valid zone. *\li 'parentalsrc' to contain the address. - * - * Returns: - *\li #ISC_R_SUCCESS */ -isc_sockaddr_t * -dns_zone_getparentalsrc4(dns_zone_t *zone); +void +dns_zone_getparentalsrc4(dns_zone_t *zone, isc_sockaddr_t *parentalsrc); /*%< * Returns the source address set by a previous dns_zone_setparentalsrc4 * call, or the default of inaddr_any, port 0. * * Require: *\li 'zone' to be a valid zone. + *\li 'parentalsrc' to be non NULL. */ -isc_result_t +void dns_zone_setparentalsrc6(dns_zone_t *zone, const isc_sockaddr_t *parentalsrc); /*%< * Set the source address to be used with IPv6 parental DS queries. @@ -973,22 +967,20 @@ dns_zone_setparentalsrc6(dns_zone_t *zone, const isc_sockaddr_t *parentalsrc); * Require: *\li 'zone' to be a valid zone. *\li 'parentalsrc' to contain the address. - * - * Returns: - *\li #ISC_R_SUCCESS */ -isc_sockaddr_t * -dns_zone_getparentalsrc6(dns_zone_t *zone); +void +dns_zone_getparentalsrc6(dns_zone_t *zone, isc_sockaddr_t *parentalsrc); /*%< * Returns the source address set by a previous dns_zone_setparentalsrc6 * call, or the default of in6addr_any, port 0. * * Require: *\li 'zone' to be a valid zone. + *\li 'parentalsrc' to be non NULL. */ -isc_result_t +void dns_zone_setnotifysrc4(dns_zone_t *zone, const isc_sockaddr_t *notifysrc); /*%< * Set the source address to be used with IPv4 NOTIFY messages. @@ -996,22 +988,20 @@ dns_zone_setnotifysrc4(dns_zone_t *zone, const isc_sockaddr_t *notifysrc); * Require: *\li 'zone' to be a valid zone. *\li 'notifysrc' to contain the address. - * - * Returns: - *\li #ISC_R_SUCCESS */ -isc_sockaddr_t * -dns_zone_getnotifysrc4(dns_zone_t *zone); +void +dns_zone_getnotifysrc4(dns_zone_t *zone, isc_sockaddr_t *notifysrc); /*%< * Returns the source address set by a previous dns_zone_setnotifysrc4 * call, or the default of inaddr_any, port 0. * * Require: *\li 'zone' to be a valid zone. + *\li 'notifysrc' to be non NULL. */ -isc_result_t +void dns_zone_setnotifysrc6(dns_zone_t *zone, const isc_sockaddr_t *notifysrc); /*%< * Set the source address to be used with IPv6 NOTIFY messages. @@ -1019,19 +1009,17 @@ dns_zone_setnotifysrc6(dns_zone_t *zone, const isc_sockaddr_t *notifysrc); * Require: *\li 'zone' to be a valid zone. *\li 'notifysrc' to contain the address. - * - * Returns: - *\li #ISC_R_SUCCESS */ -isc_sockaddr_t * -dns_zone_getnotifysrc6(dns_zone_t *zone); +void +dns_zone_getnotifysrc6(dns_zone_t *zone, isc_sockaddr_t *notifysrc); /*%< * Returns the source address set by a previous dns_zone_setnotifysrc6 * call, or the default of in6addr_any, port 0. * * Require: *\li 'zone' to be a valid zone. + *\li 'notifysrc' to be non NULL. */ void diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 17faae73878..ac4263fb466 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -5930,142 +5930,163 @@ dns_zone_getkeyopts(dns_zone_t *zone) { return atomic_load_relaxed(&zone->keyopts); } -isc_result_t +void dns_zone_setxfrsource4(dns_zone_t *zone, const isc_sockaddr_t *xfrsource) { REQUIRE(DNS_ZONE_VALID(zone)); + REQUIRE(xfrsource != NULL); LOCK_ZONE(zone); zone->xfrsource4 = *xfrsource; UNLOCK_ZONE(zone); - - return ISC_R_SUCCESS; } -isc_sockaddr_t * -dns_zone_getxfrsource4(dns_zone_t *zone) { +void +dns_zone_getxfrsource4(dns_zone_t *zone, isc_sockaddr_t *xfrsource) { REQUIRE(DNS_ZONE_VALID(zone)); - return &zone->xfrsource4; + REQUIRE(xfrsource != NULL); + + LOCK_ZONE(zone); + *xfrsource = zone->xfrsource4; + UNLOCK_ZONE(zone); } -isc_result_t +void dns_zone_setxfrsource6(dns_zone_t *zone, const isc_sockaddr_t *xfrsource) { REQUIRE(DNS_ZONE_VALID(zone)); + REQUIRE(xfrsource != NULL); LOCK_ZONE(zone); zone->xfrsource6 = *xfrsource; UNLOCK_ZONE(zone); - - return ISC_R_SUCCESS; } -isc_sockaddr_t * -dns_zone_getxfrsource6(dns_zone_t *zone) { +void +dns_zone_getxfrsource6(dns_zone_t *zone, isc_sockaddr_t *xfrsource) { REQUIRE(DNS_ZONE_VALID(zone)); - return &zone->xfrsource6; + REQUIRE(xfrsource != NULL); + + LOCK_ZONE(zone); + *xfrsource = zone->xfrsource6; + UNLOCK_ZONE(zone); } -isc_result_t -dns_zone_setaltxfrsource4(dns_zone_t *zone, - const isc_sockaddr_t *altxfrsource) { +void +dns_zone_setaltxfrsource4(dns_zone_t *zone, const isc_sockaddr_t *xfrsource) { REQUIRE(DNS_ZONE_VALID(zone)); + REQUIRE(xfrsource != NULL); LOCK_ZONE(zone); - zone->altxfrsource4 = *altxfrsource; + zone->altxfrsource4 = *xfrsource; UNLOCK_ZONE(zone); - - return ISC_R_SUCCESS; } -isc_sockaddr_t * -dns_zone_getaltxfrsource4(dns_zone_t *zone) { +void +dns_zone_getaltxfrsource4(dns_zone_t *zone, isc_sockaddr_t *xfrsource) { REQUIRE(DNS_ZONE_VALID(zone)); - return &zone->altxfrsource4; + REQUIRE(xfrsource != NULL); + + LOCK_ZONE(zone); + *xfrsource = zone->altxfrsource4; + UNLOCK_ZONE(zone); } -isc_result_t -dns_zone_setaltxfrsource6(dns_zone_t *zone, - const isc_sockaddr_t *altxfrsource) { +void +dns_zone_setaltxfrsource6(dns_zone_t *zone, const isc_sockaddr_t *xfrsource) { REQUIRE(DNS_ZONE_VALID(zone)); + REQUIRE(xfrsource != NULL); LOCK_ZONE(zone); - zone->altxfrsource6 = *altxfrsource; + zone->altxfrsource6 = *xfrsource; UNLOCK_ZONE(zone); - - return ISC_R_SUCCESS; } -isc_sockaddr_t * -dns_zone_getaltxfrsource6(dns_zone_t *zone) { +void +dns_zone_getaltxfrsource6(dns_zone_t *zone, isc_sockaddr_t *xfrsource) { REQUIRE(DNS_ZONE_VALID(zone)); - return &zone->altxfrsource6; + REQUIRE(xfrsource != NULL); + + LOCK_ZONE(zone); + *xfrsource = zone->altxfrsource6; + UNLOCK_ZONE(zone); } -isc_result_t +void dns_zone_setparentalsrc4(dns_zone_t *zone, const isc_sockaddr_t *parentalsrc) { REQUIRE(DNS_ZONE_VALID(zone)); + REQUIRE(parentalsrc != NULL); LOCK_ZONE(zone); zone->parentalsrc4 = *parentalsrc; UNLOCK_ZONE(zone); - - return ISC_R_SUCCESS; } -isc_sockaddr_t * -dns_zone_getparentalsrc4(dns_zone_t *zone) { +void +dns_zone_getparentalsrc4(dns_zone_t *zone, isc_sockaddr_t *parentalsrc) { REQUIRE(DNS_ZONE_VALID(zone)); - return &zone->parentalsrc4; + REQUIRE(parentalsrc != NULL); + + LOCK_ZONE(zone); + *parentalsrc = zone->parentalsrc4; + UNLOCK_ZONE(zone); } -isc_result_t +void dns_zone_setparentalsrc6(dns_zone_t *zone, const isc_sockaddr_t *parentalsrc) { REQUIRE(DNS_ZONE_VALID(zone)); LOCK_ZONE(zone); zone->parentalsrc6 = *parentalsrc; UNLOCK_ZONE(zone); - - return ISC_R_SUCCESS; } -isc_sockaddr_t * -dns_zone_getparentalsrc6(dns_zone_t *zone) { +void +dns_zone_getparentalsrc6(dns_zone_t *zone, isc_sockaddr_t *parentalsrc) { REQUIRE(DNS_ZONE_VALID(zone)); - return &zone->parentalsrc6; + REQUIRE(parentalsrc != NULL); + + LOCK_ZONE(zone); + *parentalsrc = zone->parentalsrc6; + UNLOCK_ZONE(zone); } -isc_result_t +void dns_zone_setnotifysrc4(dns_zone_t *zone, const isc_sockaddr_t *notifysrc) { REQUIRE(DNS_ZONE_VALID(zone)); + REQUIRE(notifysrc != NULL); LOCK_ZONE(zone); zone->notifysrc4 = *notifysrc; UNLOCK_ZONE(zone); - - return ISC_R_SUCCESS; } -isc_sockaddr_t * -dns_zone_getnotifysrc4(dns_zone_t *zone) { +void +dns_zone_getnotifysrc4(dns_zone_t *zone, isc_sockaddr_t *notifysrc) { REQUIRE(DNS_ZONE_VALID(zone)); - return &zone->notifysrc4; + REQUIRE(notifysrc != NULL); + + LOCK_ZONE(zone); + *notifysrc = zone->notifysrc4; + UNLOCK_ZONE(zone); } -isc_result_t +void dns_zone_setnotifysrc6(dns_zone_t *zone, const isc_sockaddr_t *notifysrc) { REQUIRE(DNS_ZONE_VALID(zone)); + REQUIRE(notifysrc != NULL); LOCK_ZONE(zone); zone->notifysrc6 = *notifysrc; UNLOCK_ZONE(zone); - - return ISC_R_SUCCESS; } -isc_sockaddr_t * -dns_zone_getnotifysrc6(dns_zone_t *zone) { +void +dns_zone_getnotifysrc6(dns_zone_t *zone, isc_sockaddr_t *notifysrc) { REQUIRE(DNS_ZONE_VALID(zone)); - return &zone->notifysrc6; + REQUIRE(notifysrc != NULL); + + LOCK_ZONE(zone); + *notifysrc = zone->notifysrc6; + UNLOCK_ZONE(zone); } static bool