]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add port parameter to dns_notify_create()
authorMatthijs Mekking <matthijs@isc.org>
Tue, 28 Oct 2025 14:25:29 +0000 (15:25 +0100)
committerMatthijs Mekking <matthijs@isc.org>
Fri, 19 Dec 2025 13:08:15 +0000 (14:08 +0100)
The DSYNC record has a Port rdata field, so NOTIFY(CDS) messages may be
configured at different ports. When creating a new notify, allow for
specifying the port.

lib/dns/include/dns/notify.h
lib/dns/notify.c
lib/dns/zone.c

index 02a518d4986719228fa84a5502c25037d7dee293..d6c64e5a027bfbe32cc92954f81c1ff48204a6d4 100644 (file)
@@ -51,6 +51,7 @@ struct dns_notify {
        dns_adbfind_t   *find;
        dns_request_t   *request;
        dns_name_t       ns;
+       in_port_t        port;
        isc_sockaddr_t   src;
        isc_sockaddr_t   dst;
        dns_tsigkey_t   *key;
@@ -76,7 +77,8 @@ dns_notifyctx_init(dns_notifyctx_t *nctx, dns_rdatatype_t type);
  */
 
 void
-dns_notify_create(isc_mem_t *mctx, unsigned int flags, dns_notify_t **notifyp);
+dns_notify_create(isc_mem_t *mctx, in_port_t port, unsigned int flags,
+                 dns_notify_t **notifyp);
 /*%<
  *     Create a notify structure to maintain state.
  *
@@ -96,14 +98,14 @@ dns_notify_destroy(dns_notify_t *notify, bool zone_locked);
  */
 
 bool
-dns_notify_isqueued(dns_notifyctx_t *nctx, unsigned int flags, dns_name_t *name,
-                   isc_sockaddr_t *addr, dns_tsigkey_t *key,
+dns_notify_isqueued(dns_notifyctx_t *nctx, in_port_t port, unsigned int flags,
+                   dns_name_t *name, isc_sockaddr_t *addr, dns_tsigkey_t *key,
                    dns_transport_t *transport);
 /*%<
  *     Check if we already have a notify queued matching name, destination
- *     address, TSIG key, and transport. Will requeue on the normal notify
- *     ratelimiter if the notify was enqueued on the startup ratelimiter and
- *     this is not a startup notify.
+ *     address and port, TSIG key, and transport. Will requeue on the normal
+ *     notify ratelimiter if the notify was enqueued on the startup ratelimiter
+ *     and this is not a startup notify.
  *
  *      Requires:
  *             'nctx' is not NULL
index cdb0abcc1ef51698032a001d06edbe8f24be8185..50f0bb6cea45ccdd3e847c8b6d97586085393db6 100644 (file)
@@ -53,7 +53,8 @@ dns_notifyctx_init(dns_notifyctx_t *nctx, dns_rdatatype_t type) {
 }
 
 void
-dns_notify_create(isc_mem_t *mctx, unsigned int flags, dns_notify_t **notifyp) {
+dns_notify_create(isc_mem_t *mctx, in_port_t port, unsigned int flags,
+                 dns_notify_t **notifyp) {
        dns_notify_t *notify;
 
        REQUIRE(notifyp != NULL && *notifyp == NULL);
@@ -61,6 +62,7 @@ dns_notify_create(isc_mem_t *mctx, unsigned int flags, dns_notify_t **notifyp) {
        notify = isc_mem_get(mctx, sizeof(*notify));
        *notify = (dns_notify_t){
                .flags = flags,
+               .port = port,
        };
 
        isc_mem_attach(mctx, &notify->mctx);
@@ -525,8 +527,8 @@ dns_notify_queue(dns_notify_t *notify, bool startup) {
 }
 
 bool
-dns_notify_isqueued(dns_notifyctx_t *nctx, unsigned int flags, dns_name_t *name,
-                   isc_sockaddr_t *addr, dns_tsigkey_t *key,
+dns_notify_isqueued(dns_notifyctx_t *nctx, in_port_t port, unsigned int flags,
+                   dns_name_t *name, isc_sockaddr_t *addr, dns_tsigkey_t *key,
                    dns_transport_t *transport) {
        dns_notify_t *notify = NULL;
        isc_result_t result;
@@ -540,7 +542,8 @@ dns_notify_isqueued(dns_notifyctx_t *nctx, unsigned int flags, dns_name_t *name,
                if ((name != NULL && dns_name_dynamic(&n->ns) &&
                     dns_name_equal(name, &n->ns)) ||
                    (addr != NULL && isc_sockaddr_equal(addr, &n->dst) &&
-                    n->key == key && n->transport == transport))
+                    n->port == port && n->key == key &&
+                    n->transport == transport))
                {
                        notify = n;
                        goto requeue;
@@ -646,8 +649,8 @@ notify_send(dns_notify_t *notify) {
 
        ISC_LIST_FOREACH(notify->find->list, ai, publink) {
                dst = ai->sockaddr;
-               if (dns_notify_isqueued(notifyctx, notify->flags, NULL, &dst,
-                                       NULL, NULL))
+               if (dns_notify_isqueued(notifyctx, notify->port, notify->flags,
+                                       NULL, &dst, NULL, NULL))
                {
                        continue;
                }
@@ -656,7 +659,8 @@ notify_send(dns_notify_t *notify) {
                }
                newnotify = NULL;
                flags = notify->flags & DNS_NOTIFY_NOSOA;
-               dns_notify_create(notify->mctx, flags, &newnotify);
+               dns_notify_create(notify->mctx, notify->port, flags,
+                                 &newnotify);
                dns__zone_iattach_locked(notify->zone, &newnotify->zone);
                ISC_LIST_APPEND(notifyctx->notifies, newnotify, link);
                newnotify->dst = dst;
@@ -731,7 +735,7 @@ dns_notify_find_address(dns_notify_t *notify) {
        }
 
        result = dns_adb_createfind(adb, loop, process_notify_adb_event, notify,
-                                   &notify->ns, options, 0, view->dstport, 0,
+                                   &notify->ns, options, 0, notify->port, 0,
                                    NULL, NULL, NULL, &notify->find);
        dns_adb_detach(&adb);
 
index bc8873ee69b01b239aceec9b8c1b1bb16ebc732d..cceb56d2c7f8b919ac294f7d8f122cf92ba8b1ae 100644 (file)
@@ -12598,8 +12598,8 @@ zone_notify(dns_zone_t *zone, isc_time_t *now) {
                        goto next;
                }
 
-               if (dns_notify_isqueued(&zone->notifysoa, flags, NULL, &dst,
-                                       key, transport))
+               if (dns_notify_isqueued(&zone->notifysoa, zone->view->dstport,
+                                       flags, NULL, &dst, key, transport))
                {
                        if (key != NULL) {
                                dns_tsigkey_detach(&key);
@@ -12610,7 +12610,8 @@ zone_notify(dns_zone_t *zone, isc_time_t *now) {
                        goto next;
                }
 
-               dns_notify_create(zone->mctx, flags, &notify);
+               dns_notify_create(zone->mctx, zone->view->dstport, flags,
+                                 &notify);
                zone_iattach(zone, &notify->zone);
                notify->src = src;
                notify->dst = dst;
@@ -12687,13 +12688,15 @@ zone_notify(dns_zone_t *zone, isc_time_t *now) {
                }
 
                LOCK_ZONE(zone);
-               isqueued = dns_notify_isqueued(&zone->notifysoa, flags,
+               isqueued = dns_notify_isqueued(&zone->notifysoa,
+                                              zone->view->dstport, flags,
                                               &ns.name, NULL, NULL, NULL);
                UNLOCK_ZONE(zone);
                if (isqueued) {
                        continue;
                }
-               dns_notify_create(zone->mctx, flags, &notify);
+               dns_notify_create(zone->mctx, zone->view->dstport, flags,
+                                 &notify);
                dns_zone_iattach(zone, &notify->zone);
                dns_name_dup(&ns.name, zone->mctx, &notify->ns);
                LOCK_ZONE(zone);