]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add missing locks when returning addresses
authorMark Andrews <marka@isc.org>
Thu, 12 Sep 2024 02:54:25 +0000 (12:54 +1000)
committerMark Andrews <marka@isc.org>
Sun, 16 Mar 2025 04:26:12 +0000 (15:26 +1100)
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)

bin/named/zoneconf.c
lib/dns/include/dns/zone.h
lib/dns/zone.c

index c15e6c733778ffae4c333a883b2d8f4e1449287d..c3cfbe8a98f0ae62a437e717b473d105bcf537b1 100644 (file)
@@ -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) {
index 9c63e8848cae637ab4c41ddb18706c24cc4d8cfa..2a338fe35f25d553641ad592bbac9fb4bb232146 100644 (file)
@@ -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
index 17faae738783181636d3083ab8e0df8854fe461e..ac4263fb466b50e6599aae241c741a7641f973ad 100644 (file)
@@ -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