]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add dns_name_isdnssvcb
authorMark Andrews <marka@isc.org>
Wed, 5 Oct 2022 06:09:33 +0000 (17:09 +1100)
committerMark Andrews <marka@isc.org>
Fri, 28 Oct 2022 13:22:54 +0000 (00:22 +1100)
dns_name_isdnssvcb looks for a name which starts with the label
_dns or _<port>._dns labels.

lib/dns/include/dns/name.h
lib/dns/name.c

index 01f776debbbfad8824718cc3f590d32ca3b1f389..1cf7129b81051980c25b2225f547e8c8193378ac 100644 (file)
@@ -1298,10 +1298,17 @@ dns_name_isula(const dns_name_t *owner);
 
 bool
 dns_name_istat(const dns_name_t *name);
-/*
+/*%<
  * Determine if 'name' is a potential 'trust-anchor-telemetry' name.
  */
 
+bool
+dns_name_isdnssvcb(const dns_name_t *name);
+/*%<
+ * Determine if 'name' is a dns service name,
+ * i.e. it starts with and optional _port label followed by a _dns label.
+ */
+
 ISC_LANG_ENDDECLS
 
 /*
index b8a9ec46f0a8a2dd9468ae8b7fe14c9636f907f1..96586def8cedb5e0592f6aebf0be21fa295f8934 100644 (file)
@@ -2376,3 +2376,57 @@ dns_name_istat(const dns_name_t *name) {
        }
        return (true);
 }
+
+bool
+dns_name_isdnssvcb(const dns_name_t *name) {
+       unsigned char len, len1;
+       const unsigned char *ndata;
+
+       REQUIRE(VALID_NAME(name));
+
+       if (name->labels < 1 || name->length < 5) {
+               return (false);
+       }
+
+       ndata = name->ndata;
+       len = len1 = ndata[0];
+       INSIST(len <= name->length);
+       ndata++;
+
+       if (len < 2 || ndata[0] != '_') {
+               return (false);
+       }
+       if (isdigit(ndata[1]) && name->labels > 1) {
+               char buf[sizeof("65000")];
+               long port;
+               char *endp;
+
+               /*
+                * Do we have a valid _port label?
+                */
+               if (len > 6U || (ndata[1] == '0' && len != 2)) {
+                       return (false);
+               }
+               memcpy(buf, ndata + 1, len - 1);
+               buf[len - 1] = 0;
+               port = strtol(buf, &endp, 10);
+               if (*endp != 0 || port < 0 || port > 0xffff) {
+                       return (false);
+               }
+
+               /*
+                * Move to next label.
+                */
+               ndata += len;
+               INSIST(len1 + 1U < name->length);
+               len = *ndata;
+               INSIST(len + len1 + 1U <= name->length);
+               ndata++;
+       }
+
+       if (len == 4U && strncasecmp((const char *)ndata, "_dns", 4) == 0) {
+               return (true);
+       }
+
+       return (false);
+}