]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Tighten LOC parsing to reject period and/or m as a value.
authorMark Andrews <marka@isc.org>
Wed, 19 Aug 2020 08:47:35 +0000 (18:47 +1000)
committerOndřej Surý <ondrej@isc.org>
Wed, 26 Aug 2020 13:31:31 +0000 (15:31 +0200)
lib/dns/rdata/generic/loc_29.c
lib/dns/tests/rdata_test.c

index 26e6381942e00ba7b8384c5169f18cb0d5594519..96022300c921ed2f559135e0362d371a947a8e5c 100644 (file)
@@ -39,6 +39,7 @@ fromtext_loc(ARGS_FROMTEXT) {
        unsigned long latitude;
        unsigned long longitude;
        unsigned long altitude;
+       bool ok;
 
        REQUIRE(type == dns_rdatatype_loc);
 
@@ -106,6 +107,7 @@ fromtext_loc(ARGS_FROMTEXT) {
        if (s1 < 0 || s1 > 59) {
                RETTOK(ISC_R_RANGE);
        }
+       ok = e != DNS_AS_STR(token);
        if (*e == '.') {
                const char *l;
                e++;
@@ -116,6 +118,7 @@ fromtext_loc(ARGS_FROMTEXT) {
                        if ((tmp = decvalue(*e++)) < 0) {
                                RETTOK(DNS_R_SYNTAX);
                        }
+                       ok = true;
                        s1 *= 10;
                        s1 += tmp;
                }
@@ -143,6 +146,9 @@ fromtext_loc(ARGS_FROMTEXT) {
        } else {
                s1 *= 1000;
        }
+       if (!ok) {
+               RETTOK(DNS_R_SYNTAX);
+       }
        if (d1 == 90 && s1 != 0) {
                RETTOK(ISC_R_RANGE);
        }
@@ -210,6 +216,7 @@ getlong:
        if (s2 < 0 || s2 > 59) {
                RETTOK(ISC_R_RANGE);
        }
+       ok = e != DNS_AS_STR(token);
        if (*e == '.') {
                const char *l;
                e++;
@@ -220,6 +227,7 @@ getlong:
                        if ((tmp = decvalue(*e++)) < 0) {
                                RETTOK(DNS_R_SYNTAX);
                        }
+                       ok = true;
                        s2 *= 10;
                        s2 += tmp;
                }
@@ -247,6 +255,9 @@ getlong:
        } else {
                s2 *= 1000;
        }
+       if (!ok) {
+               RETTOK(DNS_R_SYNTAX);
+       }
        if (d2 == 180 && s2 != 0) {
                RETTOK(ISC_R_RANGE);
        }
@@ -277,6 +288,7 @@ getalt:
                RETTOK(ISC_R_RANGE);
        }
        cm = 0;
+       ok = e != DNS_AS_STR(token);
        if (*e == '.') {
                e++;
                for (i = 0; i < 2; i++) {
@@ -286,6 +298,7 @@ getalt:
                        if ((tmp = decvalue(*e++)) < 0) {
                                return (DNS_R_SYNTAX);
                        }
+                       ok = true;
                        cm *= 10;
                        if (m < 0) {
                                cm -= tmp;
@@ -299,7 +312,7 @@ getalt:
        if (*e == 'm') {
                e++;
        }
-       if (*e != 0) {
+       if (!ok || *e != 0) {
                RETTOK(DNS_R_SYNTAX);
        }
        if (m == -100000 && cm != 0) {
@@ -333,6 +346,7 @@ getalt:
                RETTOK(ISC_R_RANGE);
        }
        cm = 0;
+       ok = e != DNS_AS_STR(token);
        if (*e == '.') {
                e++;
                for (i = 0; i < 2; i++) {
@@ -342,6 +356,7 @@ getalt:
                        if ((tmp = decvalue(*e++)) < 0) {
                                RETTOK(DNS_R_SYNTAX);
                        }
+                       ok = true;
                        cm *= 10;
                        cm += tmp;
                }
@@ -351,7 +366,7 @@ getalt:
        if (*e == 'm') {
                e++;
        }
-       if (*e != 0) {
+       if (!ok || *e != 0) {
                RETTOK(DNS_R_SYNTAX);
        }
        /*
@@ -394,6 +409,7 @@ getalt:
                RETTOK(ISC_R_RANGE);
        }
        cm = 0;
+       ok = e != DNS_AS_STR(token);
        if (*e == '.') {
                e++;
                for (i = 0; i < 2; i++) {
@@ -403,6 +419,7 @@ getalt:
                        if ((tmp = decvalue(*e++)) < 0) {
                                RETTOK(DNS_R_SYNTAX);
                        }
+                       ok = true;
                        cm *= 10;
                        cm += tmp;
                }
@@ -412,7 +429,7 @@ getalt:
        if (*e == 'm') {
                e++;
        }
-       if (*e != 0) {
+       if (!ok || *e != 0) {
                RETTOK(DNS_R_SYNTAX);
        }
        /*
@@ -453,6 +470,7 @@ getalt:
                RETTOK(ISC_R_RANGE);
        }
        cm = 0;
+       ok = e != DNS_AS_STR(token);
        if (*e == '.') {
                e++;
                for (i = 0; i < 2; i++) {
@@ -462,6 +480,7 @@ getalt:
                        if ((tmp = decvalue(*e++)) < 0) {
                                RETTOK(DNS_R_SYNTAX);
                        }
+                       ok = true;
                        cm *= 10;
                        cm += tmp;
                }
@@ -471,7 +490,7 @@ getalt:
        if (*e == 'm') {
                e++;
        }
-       if (*e != 0) {
+       if (!ok || *e != 0) {
                RETTOK(DNS_R_SYNTAX);
        }
        /*
index 41529c6610491498f5955d290bf2178864f64b77..084d8d4c72d30fb124a9062a01a8880fdce7d970 100644 (file)
@@ -1969,6 +1969,63 @@ key(void **state) {
                    dns_rdatatype_key, sizeof(dns_rdata_key_t));
 }
 
+/*
+ * LOC tests.
+ */
+static void
+loc(void **state) {
+       text_ok_t text_ok[] = {
+               TEXT_VALID_CHANGED("0 N 0 E 0", "0 0 0.000 N 0 0 0.000 E 0.00m "
+                                               "1m 10000m 10m"),
+               TEXT_VALID_CHANGED("0 S 0 W 0", "0 0 0.000 N 0 0 0.000 E 0.00m "
+                                               "1m 10000m 10m"),
+               TEXT_VALID_CHANGED("0 0 N 0 0 E 0", "0 0 0.000 N 0 0 0.000 E "
+                                                   "0.00m 1m 10000m 10m"),
+               TEXT_VALID_CHANGED("0 0 0 N 0 0 0 E 0",
+                                  "0 0 0.000 N 0 0 0.000 E 0.00m 1m 10000m "
+                                  "10m"),
+               TEXT_VALID_CHANGED("0 0 0 N 0 0 0 E 0",
+                                  "0 0 0.000 N 0 0 0.000 E 0.00m 1m 10000m "
+                                  "10m"),
+               TEXT_VALID_CHANGED("0 0 0. N 0 0 0. E 0",
+                                  "0 0 0.000 N 0 0 0.000 E 0.00m 1m 10000m "
+                                  "10m"),
+               TEXT_VALID_CHANGED("0 0 .0 N 0 0 .0 E 0",
+                                  "0 0 0.000 N 0 0 0.000 E 0.00m 1m 10000m "
+                                  "10m"),
+               TEXT_INVALID("0 0 . N 0 0 0. E 0"),
+               TEXT_INVALID("0 0 0. N 0 0 . E 0"),
+               TEXT_INVALID("0 0 0. N 0 0 0. E m"),
+               TEXT_INVALID("0 0 0. N 0 0 0. E 0 ."),
+               TEXT_INVALID("0 0 0. N 0 0 0. E 0 m"),
+               TEXT_INVALID("0 0 0. N 0 0 0. E 0 0 ."),
+               TEXT_INVALID("0 0 0. N 0 0 0. E 0 0 m"),
+               TEXT_INVALID("0 0 0. N 0 0 0. E 0 0 0 ."),
+               TEXT_INVALID("0 0 0. N 0 0 0. E 0 0 0 m"),
+               TEXT_VALID_CHANGED("90 N 180 E 0", "90 0 0.000 N 180 0 0.000 E "
+                                                  "0.00m 1m 10000m 10m"),
+               TEXT_INVALID("90 1 N 180 E 0"),
+               TEXT_INVALID("90 0 1 N 180 E 0"),
+               TEXT_INVALID("90 N 180 1 E 0"),
+               TEXT_INVALID("90 N 180 0 1 E 0"),
+               TEXT_VALID_CHANGED("90 S 180 W 0", "90 0 0.000 S 180 0 0.000 W "
+                                                  "0.00m 1m 10000m 10m"),
+               TEXT_INVALID("90 1 S 180 W 0"),
+               TEXT_INVALID("90 0 1 S 180 W 0"),
+               TEXT_INVALID("90 S 180 1 W 0"),
+               TEXT_INVALID("90 S 180 0 1 W 0"),
+               /*
+                * Sentinel.
+                */
+               TEXT_SENTINEL()
+       };
+
+       UNUSED(state);
+
+       check_rdata(text_ok, 0, NULL, false, dns_rdataclass_in,
+                   dns_rdatatype_loc, sizeof(dns_rdata_loc_t));
+}
+
 /*
  * http://ana-3.lcs.mit.edu/~jnc/nimrod/dns.txt
  *
@@ -2579,6 +2636,7 @@ main(int argc, char **argv) {
                cmocka_unit_test_setup_teardown(hip, _setup, _teardown),
                cmocka_unit_test_setup_teardown(isdn, _setup, _teardown),
                cmocka_unit_test_setup_teardown(key, _setup, _teardown),
+               cmocka_unit_test_setup_teardown(loc, _setup, _teardown),
                cmocka_unit_test_setup_teardown(nimloc, _setup, _teardown),
                cmocka_unit_test_setup_teardown(nsec, _setup, _teardown),
                cmocka_unit_test_setup_teardown(nsec3, _setup, _teardown),