a69985
From 2eca7f5fa97a24997e4d8f900460ba43ae167e97 Mon Sep 17 00:00:00 2001
a69985
From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= <pemensik@redhat.com>
a69985
Date: Tue, 29 Jan 2019 18:07:44 +0100
a69985
Subject: [PATCH] Fallback to ASCII on output IDN conversion error
a69985
a69985
It is possible dig used ACE encoded name in locale, which does not
a69985
support converting it to unicode. Instead of fatal error, fallback to
a69985
ACE name on output.
a69985
a69985
(cherry picked from commit 7f4cb8f9584597fea16de6557124ac8b1bd47440)
a69985
a69985
Modify idna test to fallback to ACE
a69985
a69985
Test valid A-label on input would be displayed as A-label on output if
a69985
locale does not allow U-label.
a69985
a69985
(cherry picked from commit 4ce232f8605bdbe0594ebe5a71383c9d4e6f263b)
a69985
a69985
Emit warning on IDN output failure
a69985
a69985
Warning is emitted before any dig headers.
a69985
a69985
(cherry picked from commit 4b410038c531fbb902cd5fb83174eed1f06cb7d7)
a69985
---
a69985
 bin/dig/dighost.c              | 15 +++++++++++++--
a69985
 bin/tests/system/idna/tests.sh | 17 +++++++++++++++++
a69985
 2 files changed, 30 insertions(+), 2 deletions(-)
a69985
a69985
diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c
a69985
index bb8702c..d7cfc33 100644
a69985
--- a/bin/dig/dighost.c
a69985
+++ b/bin/dig/dighost.c
a69985
@@ -4860,9 +4860,20 @@ idn_ace_to_locale(const char *from, char *to, size_t tolen) {
a69985
 	 */
a69985
 	res = idn2_to_unicode_8zlz(utf8_src, &tmp_str, 0);
a69985
 	if (res != IDN2_OK) {
a69985
-		fatal("Cannot represent '%s' in the current locale (%s), "
a69985
-		      "use +noidnout or a different locale",
a69985
+		static bool warned = false;
a69985
+
a69985
+		res = idn2_to_ascii_8z(utf8_src, &tmp_str, 0);
a69985
+		if (res != IDN2_OK) {
a69985
+			fatal("Cannot represent '%s' "
a69985
+			      "in the current locale nor ascii (%s), "
a69985
+			      "use +noidnout or a different locale",
a69985
 		      from, idn2_strerror(res));
a69985
+		} else if (!warned) {
a69985
+			fprintf(stderr, ";; Warning: cannot represent '%s' "
a69985
+			      "in the current locale",
a69985
+			      tmp_str);
a69985
+			warned = true;
a69985
+		}
a69985
 	}
a69985
 
a69985
 	/*
a69985
diff --git a/bin/tests/system/idna/tests.sh b/bin/tests/system/idna/tests.sh
a69985
index 6637bf6..215a9d5 100644
a69985
--- a/bin/tests/system/idna/tests.sh
a69985
+++ b/bin/tests/system/idna/tests.sh
a69985
@@ -244,6 +244,23 @@ idna_enabled_test() {
a69985
     idna_test "$text" "+idnin +noidnout"   "xn--nxasmq6b.com" "xn--nxasmq6b.com."
a69985
     idna_test "$text" "+idnin +idnout"     "xn--nxasmq6b.com" "βόλοσ.com."
a69985
 
a69985
+    # Test of valid A-label in locale that cannot display it
a69985
+    #
a69985
+    # +noidnout: The string is sent as-is to the server and the returned qname
a69985
+    #            is displayed in the same form.
a69985
+    # +idnout:   The string is sent as-is to the server and the returned qname
a69985
+    #            is displayed as the corresponding A-label.
a69985
+    #
a69985
+    # The "+[no]idnout" flag has no effect in these cases.
a69985
+    text="Checking valid A-label in C locale"
a69985
+    label="xn--nxasmq6b.com"
a69985
+    LC_ALL=C idna_test "$text" ""                   "$label" "$label."
a69985
+    LC_ALL=C idna_test "$text" "+noidnin +noidnout" "$label" "$label."
a69985
+    LC_ALL=C idna_test "$text" "+noidnin +idnout"   "$label" "$label."
a69985
+    LC_ALL=C idna_test "$text" "+idnin +noidnout"   "$label" "$label."
a69985
+    LC_ALL=C idna_test "$text" "+idnin +idnout"     "$label" "$label."
a69985
+    LC_ALL=C idna_test "$text" "+noidnin +idnout"   "$label" "$label."
a69985
+
a69985
 
a69985
 
a69985
     # Tests of invalid A-labels
a69985
-- 
a69985
2.20.1
a69985