From b5e39c20d9c2e0c1897da12a21162f6d33e29552 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 9 Nov 2020 23:10:43 +0100 Subject: [PATCH] dns-domain: try IDN2003 rules if IDN2008 doesn't work This follows more closely what web browsers do, and makes sure emojis in domains work. Fixes: #14483 (cherry picked from commit d80e72ec602c2af2983842ad87e4443fce89d423) --- src/shared/dns-domain.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/shared/dns-domain.c b/src/shared/dns-domain.c index 8bd1e3a6ac..b02ad3f521 100644 --- a/src/shared/dns-domain.c +++ b/src/shared/dns-domain.c @@ -1291,8 +1291,14 @@ int dns_name_apply_idna(const char *name, char **ret) { assert(name); assert(ret); + /* First, try non-transitional mode (i.e. IDN2008 rules) */ r = sym_idn2_lookup_u8((uint8_t*) name, (uint8_t**) &t, IDN2_NFC_INPUT | IDN2_NONTRANSITIONAL); + if (r == IDN2_DISALLOWED) /* If that failed, because of disallowed characters, try transitional mode. + * (i.e. IDN2003 rules which supports some unicode chars IDN2008 doesn't allow). */ + r = sym_idn2_lookup_u8((uint8_t*) name, (uint8_t**) &t, + IDN2_NFC_INPUT | IDN2_TRANSITIONAL); + log_debug("idn2_lookup_u8: %s → %s", name, t); if (r == IDN2_OK) { if (!startswith(name, "xn--")) { -- 2.25.1