]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Allow fallback to IDNA2003 processing
authorOndřej Surý <ondrej@isc.org>
Fri, 26 Aug 2022 10:24:07 +0000 (12:24 +0200)
committerOndřej Surý <ondrej@isc.org>
Mon, 5 Sep 2022 08:34:49 +0000 (10:34 +0200)
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.

bin/dig/dighost.c

index d1e8e5784db7b48f643f882131aafde64c1e3772..c9a43c8eb95084a31402e54f02cb1d6be7c2dd95 100644 (file)
@@ -4753,6 +4753,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));
@@ -4814,9 +4817,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));