]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
AMTRELAY type 0 presentation format handling was wrong
authorMark Andrews <marka@isc.org>
Fri, 14 Nov 2025 01:59:29 +0000 (12:59 +1100)
committerMark Andrews <marka@isc.org>
Thu, 20 Nov 2025 07:28:32 +0000 (18:28 +1100)
RFC 8777 specifies a placeholder value of "." for the gateway field
when the gateway type is 0 (no gateway).

bin/tests/system/checkzone/zones/bad-cname-and-amtrelay.db [moved from bin/tests/system/checkzone/zones/bad-cname-and-atmrelay.db with 95% similarity]
bin/tests/system/doth/example.axfr.good
bin/tests/system/doth/example8.axfr.good
bin/tests/system/genzone.sh
bin/tests/system/xfer/dig1.good
bin/tests/system/xfer/dig2.good
lib/dns/rdata/generic/amtrelay_260.c
tests/dns/rdata_test.c

similarity index 95%
rename from bin/tests/system/checkzone/zones/bad-cname-and-atmrelay.db
rename to bin/tests/system/checkzone/zones/bad-cname-and-amtrelay.db
index dc193af66b5a5e5684d765903ecf1a64fedf2624..7c2aab24497d4bf08f113289adfbda76b4f7f41d 100644 (file)
@@ -13,5 +13,5 @@ $TTL 600
 @              SOA     ns hostmaster 2011012708 3600 1200 604800 1200
                NS      ns
 ns             A       192.0.2.1
-bad            ATMRELAY        0 0 0
+bad            AMTRELAY        0 0 0 .
 bad            CNAME   @
index d9e3cbf68ec40d823bd79c294fa9b0c165703d82..cf14b43d8807c1451503dd8c4facc8f899fab56a 100644 (file)
@@ -11,8 +11,8 @@ aaaa01.example.               3600    IN      AAAA    ::1
 aaaa02.example.                3600    IN      AAAA    fd92:7065:b8e:ffff::5
 afsdb01.example.       3600    IN      AFSDB   0 hostname.example.
 afsdb02.example.       3600    IN      AFSDB   65535 .
-amtrelay01.example.    3600    IN      AMTRELAY 0 0 0
-amtrelay02.example.    3600    IN      AMTRELAY 0 1 0
+amtrelay01.example.    3600    IN      AMTRELAY 0 0 0 .
+amtrelay02.example.    3600    IN      AMTRELAY 0 1 0 .
 amtrelay03.example.    3600    IN      AMTRELAY 0 0 1 0.0.0.0
 amtrelay04.example.    3600    IN      AMTRELAY 0 0 2 ::
 amtrelay05.example.    3600    IN      AMTRELAY 0 0 3 example.net.
index 445653f394bf33769a2af4b1a45d68047d0c5ab4..ba3ef8722130ee43d4567123c61e3c6aaf065c36 100644 (file)
@@ -11,8 +11,8 @@ aaaa01.example8.      3600    IN      AAAA    ::1
 aaaa02.example8.       3600    IN      AAAA    fd92:7065:b8e:ffff::5
 afsdb01.example8.      3600    IN      AFSDB   0 hostname.example8.
 afsdb02.example8.      3600    IN      AFSDB   65535 .
-amtrelay01.example8.   3600    IN      AMTRELAY 0 0 0
-amtrelay02.example8.   3600    IN      AMTRELAY 0 1 0
+amtrelay01.example8.   3600    IN      AMTRELAY 0 0 0 .
+amtrelay02.example8.   3600    IN      AMTRELAY 0 1 0 .
 amtrelay03.example8.   3600    IN      AMTRELAY 0 0 1 0.0.0.0
 amtrelay04.example8.   3600    IN      AMTRELAY 0 0 2 ::
 amtrelay05.example8.   3600    IN      AMTRELAY 0 0 3 example.net.
index 6762efd290f054988cc2fe8807e46fa715f3bce8..70b4a9cf02e0ccb6a1f2c205bb39265712f1cd87 100644 (file)
@@ -487,8 +487,8 @@ doa01                       DOA     ( 1234567890 1234567890 1 "image/gif"
 doa02                  DOA     0 1 2 "" aHR0cHM6Ly93d3cuaXNjLm9yZy8=
 
 ; type 260
-amtrelay01             AMTRELAY 0 0 0
-amtrelay02             AMTRELAY 0 1 0
+amtrelay01             AMTRELAY 0 0 0 .
+amtrelay02             AMTRELAY 0 1 0 .
 amtrelay03             AMTRELAY 0 0 1 0.0.0.0
 amtrelay04             AMTRELAY 0 0 2 ::
 amtrelay05             AMTRELAY 0 0 3 example.net.
index dd0feed75385a36b2efd8e6bd25072a72284bd41..06f9790d40d600b76a40a98e958a59c17a2f62f7 100644 (file)
@@ -12,8 +12,8 @@ aaaa01.example.               3600    IN      AAAA    ::1
 aaaa02.example.                3600    IN      AAAA    fd92:7065:b8e:ffff::5
 afsdb01.example.       3600    IN      AFSDB   0 hostname.example.
 afsdb02.example.       3600    IN      AFSDB   65535 .
-amtrelay01.example.    3600    IN      AMTRELAY 0 0 0
-amtrelay02.example.    3600    IN      AMTRELAY 0 1 0
+amtrelay01.example.    3600    IN      AMTRELAY 0 0 0 .
+amtrelay02.example.    3600    IN      AMTRELAY 0 1 0 .
 amtrelay03.example.    3600    IN      AMTRELAY 0 0 1 0.0.0.0
 amtrelay04.example.    3600    IN      AMTRELAY 0 0 2 ::
 amtrelay05.example.    3600    IN      AMTRELAY 0 0 3 example.net.
index 880368c60398aa094f940223f66388e95891cf9e..1c1c60e40417fb401a34ca61bad6f56522e26614 100644 (file)
@@ -12,8 +12,8 @@ aaaa01.example.               3600    IN      AAAA    ::1
 aaaa02.example.                3600    IN      AAAA    fd92:7065:b8e:ffff::5
 afsdb01.example.       3600    IN      AFSDB   0 hostname.example.
 afsdb02.example.       3600    IN      AFSDB   65535 .
-amtrelay01.example.    3600    IN      AMTRELAY 0 0 0
-amtrelay02.example.    3600    IN      AMTRELAY 0 1 0
+amtrelay01.example.    3600    IN      AMTRELAY 0 0 0 .
+amtrelay02.example.    3600    IN      AMTRELAY 0 1 0 .
 amtrelay03.example.    3600    IN      AMTRELAY 0 0 1 0.0.0.1
 amtrelay04.example.    3600    IN      AMTRELAY 0 0 2 ::
 amtrelay05.example.    3600    IN      AMTRELAY 0 0 3 example.net.
index c22a7d3fd62741d1db000bce526cd35ae9eeed72..0adec2ff84c8b4177ca67e6f1e68ae2af5429693 100644 (file)
@@ -67,21 +67,22 @@ fromtext_amtrelay(ARGS_FROMTEXT) {
        RETERR(uint8_tobuffer(token.value.as_ulong | (discovery << 7), target));
        gateway = token.value.as_ulong;
 
-       if (gateway == 0) {
-               return ISC_R_SUCCESS;
-       }
-
-       if (gateway > 3) {
-               return ISC_R_NOTIMPLEMENTED;
-       }
-
        /*
-        * Gateway.
+        * Gateway (must exist).
         */
        RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
                                      false));
 
+       if (gateway > 3) {
+               return ISC_R_NOTIMPLEMENTED;
+       }
+
        switch (gateway) {
+       case 0:
+               if (strcmp(DNS_AS_STR(token), ".") != 0) {
+                       RETTOK(DNS_R_SYNTAX);
+               }
+               return ISC_R_SUCCESS;
        case 1:
                if (inet_pton(AF_INET, DNS_AS_STR(token), &addr) != 1) {
                        RETTOK(DNS_R_BADDOTTEDQUAD);
@@ -125,7 +126,6 @@ totext_amtrelay(ARGS_TOTEXT) {
        unsigned char precedence;
        unsigned char discovery;
        unsigned char gateway;
-       const char *space;
 
        UNUSED(tctx);
 
@@ -151,9 +151,8 @@ totext_amtrelay(ARGS_TOTEXT) {
        gateway = uint8_fromregion(&region);
        discovery = gateway >> 7;
        gateway &= 0x7f;
-       space = (gateway != 0U) ? " " : "";
        isc_region_consume(&region, 1);
-       snprintf(buf, sizeof(buf), "%u %u%s", discovery, gateway, space);
+       snprintf(buf, sizeof(buf), "%u %u ", discovery, gateway);
        RETERR(str_totext(buf, target));
 
        /*
@@ -161,7 +160,8 @@ totext_amtrelay(ARGS_TOTEXT) {
         */
        switch (gateway) {
        case 0:
-               break;
+               return str_totext(".", target);
+
        case 1:
                return inet_totext(AF_INET, tctx->flags, &region, target);
 
index 2141596854b040e2857c988a7f385d1ce77442d3..2ef35f1b905f99fa046baaf126466eceb28a90ea 100644 (file)
@@ -1029,11 +1029,13 @@ ISC_RUN_TEST_IMPL(atma) {
 ISC_RUN_TEST_IMPL(amtrelay) {
        text_ok_t text_ok[] = {
                TEXT_INVALID(""), TEXT_INVALID("0"), TEXT_INVALID("0 0"),
+               TEXT_INVALID("0 0 0"),
                /* gateway type 0 */
-               TEXT_VALID("0 0 0"), TEXT_VALID("0 1 0"),
-               TEXT_INVALID("0 2 0"),   /* discovery out of range */
-               TEXT_VALID("255 1 0"),   /* max precedence */
-               TEXT_INVALID("256 1 0"), /* precedence out of range */
+               TEXT_INVALID("0 0 0 x"), /* bad placeholder */
+               TEXT_VALID("0 0 0 ."), TEXT_VALID("0 1 0 ."),
+               TEXT_INVALID("0 2 0 ."),   /* discovery out of range */
+               TEXT_VALID("255 1 0 ."),   /* max precedence */
+               TEXT_INVALID("256 1 0 ."), /* precedence out of range */
 
                /* IPv4 gateway */
                TEXT_INVALID("0 0 1"), /* no address */