[tor-commits] [tor/maint-0.3.3] Validate hostnames with punycode TLDs correctly
nickm at torproject.org
nickm at torproject.org
Wed Mar 28 11:50:56 UTC 2018
commit dbb7c8e6fd757db51226a47a2e14f4fd1aaf60c3
Author: rl1987 <rl1987 at sdf.lonestar.org>
Date: Sat Feb 17 21:49:02 2018 +0100
Validate hostnames with punycode TLDs correctly
---
src/common/util.c | 17 +++++++++++++----
src/test/test_util.c | 4 ++++
2 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/src/common/util.c b/src/common/util.c
index 096188cfc..a55f7a3cd 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -1119,7 +1119,8 @@ string_is_valid_hostname(const char *string)
/* Allow a single terminating '.' used rarely to indicate domains
* are FQDNs rather than relative. */
- last_label = (char *)smartlist_get(components, smartlist_len(components) - 1);
+ last_label = (char *)smartlist_get(components,
+ smartlist_len(components) - 1);
has_trailing_dot = (last_label[0] == '\0');
if (has_trailing_dot) {
smartlist_pop_last(components);
@@ -1133,12 +1134,20 @@ string_is_valid_hostname(const char *string)
break;
}
- if (c_sl_idx == c_sl_len - 1) {
+ if (c_sl_idx == c_sl_len - 1) { // TLD validation.
+ int is_punycode = (strlen(c) > 4 &&
+ (c[0] == 'X' || c[0] == 'x') &&
+ (c[1] == 'N' || c[1] == 'n') &&
+ c[2] == '-' && c[3] == '-');
+
+ if (is_punycode)
+ c += 4;
+
do {
- result = TOR_ISALPHA(*c);
+ result = is_punycode ? TOR_ISALNUM(*c) : TOR_ISALPHA(*c);
c++;
} while (result && *c);
- } else {
+ } else { // Regular hostname label validation.
do {
result = (TOR_ISALNUM(*c) || (*c == '-') || (*c == '_'));
c++;
diff --git a/src/test/test_util.c b/src/test/test_util.c
index db2ea1a34..ef1f420fe 100644
--- a/src/test/test_util.c
+++ b/src/test/test_util.c
@@ -5595,6 +5595,10 @@ test_util_hostname_validation(void *arg)
tt_assert(!string_is_valid_hostname("luck.y13"));
tt_assert(!string_is_valid_hostname("luck.y13."));
+ // We allow punycode TLDs. For examples, see
+ // http://data.iana.org/TLD/tlds-alpha-by-domain.txt
+ tt_assert(string_is_valid_hostname("example.xn--l1acc"));
+
done:
return;
}
More information about the tor-commits
mailing list