From: Mark Andrews Date: Wed, 19 Aug 2020 08:47:35 +0000 (+1000) Subject: Tighten LOC parsing to reject period and/or m as a value. X-Git-Tag: v9.17.5~28^2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9225c67835a9d93122632ad879533f50faec8640;p=thirdparty%2Fbind9.git Tighten LOC parsing to reject period and/or m as a value. --- diff --git a/lib/dns/rdata/generic/loc_29.c b/lib/dns/rdata/generic/loc_29.c index 26e6381942e..96022300c92 100644 --- a/lib/dns/rdata/generic/loc_29.c +++ b/lib/dns/rdata/generic/loc_29.c @@ -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); } /* diff --git a/lib/dns/tests/rdata_test.c b/lib/dns/tests/rdata_test.c index 41529c66104..084d8d4c72d 100644 --- a/lib/dns/tests/rdata_test.c +++ b/lib/dns/tests/rdata_test.c @@ -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),