From efbdf819310c8a41d2a54cffbd2a3e57232e7e1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Fri, 26 Aug 2022 12:24:07 +0200 Subject: [PATCH] Allow fallback to IDNA2003 processing In several cases where IDNA2008 mappings do not exist whereas IDNA2003 mappings do, dig was failing to process the suplied domain name. Take a backwards compatible approach, and convert the domain to IDNA2008 form, and if that fails try the IDNA2003 conversion. (cherry picked from commit 10923f9d8725c8d776b591f90a5f7e82dbae6752) --- bin/dig/dighost.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index e0ba9c2aae..6b13c55693 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -4480,6 +4480,9 @@ idn_locale_to_ace(const char *src, char *dst, size_t dstlen) { * valid domain name. */ res = idn2_to_ascii_lz(src, &ascii_src, IDN2_NONTRANSITIONAL); + if (res == IDN2_DISALLOWED) { + res = idn2_to_ascii_lz(src, &ascii_src, IDN2_TRANSITIONAL); + } if (res != IDN2_OK) { fatal("'%s' is not a legal IDNA2008 name (%s), use +noidnin", src, idn2_strerror(res)); @@ -4541,9 +4544,13 @@ idn_ace_to_locale(const char *src, char **dst) { } /* - * Then, check whether decoded 'src' is a valid IDNA2008 name. + * Then, check whether decoded 'src' is a valid IDNA2008 name + * and if disallowed character is found, fallback to IDNA2003. */ res = idn2_to_ascii_8z(utf8_src, NULL, IDN2_NONTRANSITIONAL); + if (res == IDN2_DISALLOWED) { + res = idn2_to_ascii_8z(utf8_src, NULL, IDN2_TRANSITIONAL); + } if (res != IDN2_OK) { fatal("'%s' is not a legal IDNA2008 name (%s), use +noidnout", src, idn2_strerror(res));