You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
303 lines
10 KiB
303 lines
10 KiB
From fb4271f5881a83c2cfb639587597b9a80c536a6d Mon Sep 17 00:00:00 2001 |
|
From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= <pemensik@redhat.com> |
|
Date: Tue, 29 Jan 2019 20:59:57 +0100 |
|
Subject: [PATCH] Replace libidn2 support with libidn |
|
|
|
They should be more or less compatible. Try to maintain original |
|
behaviour of old 9.11 libidn patch, ignore any in output filter. |
|
--- |
|
bin/dig/Makefile.in | 6 ++--- |
|
bin/dig/dighost.c | 64 ++++++++++++++++++++++++++++++--------------- |
|
config.h.in | 4 +-- |
|
configure.in | 56 +++++++++++++++++++-------------------- |
|
4 files changed, 76 insertions(+), 54 deletions(-) |
|
|
|
diff --git a/bin/dig/Makefile.in b/bin/dig/Makefile.in |
|
index 3edd951..75441b0 100644 |
|
--- a/bin/dig/Makefile.in |
|
+++ b/bin/dig/Makefile.in |
|
@@ -19,7 +19,7 @@ READLINE_LIB = @READLINE_LIB@ |
|
|
|
CINCLUDES = -I${srcdir}/include ${DNS_INCLUDES} \ |
|
${BIND9_INCLUDES} ${ISC_INCLUDES} \ |
|
- ${LWRES_INCLUDES} ${ISCCFG_INCLUDES} @LIBIDN2_CFLAGS@ @DST_OPENSSL_INC@ |
|
+ ${LWRES_INCLUDES} ${ISCCFG_INCLUDES} @LIBIDN_CFLAGS@ @DST_OPENSSL_INC@ |
|
|
|
CDEFINES = -DVERSION=\"${VERSION}\" @CRYPTO@ |
|
CWARNINGS = |
|
@@ -41,10 +41,10 @@ DEPLIBS = ${DNSDEPLIBS} ${BIND9DEPLIBS} ${ISCDEPLIBS} \ |
|
${ISCCFGDEPLIBS} ${LWRESDEPLIBS} |
|
|
|
LIBS = ${LWRESLIBS} ${BIND9LIBS} ${ISCCFGLIBS} \ |
|
- ${ISCLIBS} @IDNKIT_LIBS@ @LIBIDN2_LIBS@ @LIBS@ |
|
+ ${ISCLIBS} @IDNKIT_LIBS@ @LIBIDN_LIBS@ @LIBS@ |
|
|
|
NOSYMLIBS = ${LWRESLIBS} ${BIND9LIBS} ${ISCCFGLIBS} \ |
|
- ${ISCNOSYMLIBS} @IDNKIT_LIBS@ @LIBIDN2_LIBS@ @LIBS@ |
|
+ ${ISCNOSYMLIBS} @IDNKIT_LIBS@ @LIBIDN_LIBS@ @LIBS@ |
|
|
|
SUBDIRS = |
|
|
|
diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c |
|
index ffc16c4..a345a21 100644 |
|
--- a/bin/dig/dighost.c |
|
+++ b/bin/dig/dighost.c |
|
@@ -38,8 +38,9 @@ |
|
#include <idn/api.h> |
|
#endif |
|
|
|
-#ifdef WITH_LIBIDN2 |
|
-#include <idn2.h> |
|
+#ifdef WITH_LIBIDN |
|
+#include <stringprep.h> |
|
+#include <idna.h> |
|
#endif |
|
#endif /* WITH_IDN_SUPPORT */ |
|
|
|
@@ -4761,7 +4762,7 @@ idn_ace_to_locale(const char *from, char *to, size_t tolen) { |
|
} |
|
#endif /* WITH_IDNKIT */ |
|
|
|
-#ifdef WITH_LIBIDN2 |
|
+#ifdef WITH_LIBIDN |
|
static void |
|
idn_initialize(void) { |
|
} |
|
@@ -4769,16 +4770,25 @@ idn_initialize(void) { |
|
static isc_result_t |
|
idn_locale_to_ace(const char *from, char *to, size_t tolen) { |
|
int res; |
|
+ char *utf8_str; |
|
char *tmp_str = NULL; |
|
|
|
- res = idn2_to_ascii_lz(from, &tmp_str, IDN2_NONTRANSITIONAL|IDN2_NFC_INPUT); |
|
- if (res == IDN2_DISALLOWED) { |
|
- res = idn2_to_ascii_lz(from, &tmp_str, IDN2_TRANSITIONAL|IDN2_NFC_INPUT); |
|
+ debug ("libidn_locale_to_utf8"); |
|
+ utf8_str = stringprep_locale_to_utf8 (from); |
|
+ if (utf8_str == NULL) { |
|
+ debug ("libidn stringprep_locale_to_utf8 failure"); |
|
+ return ISC_R_FAILURE; |
|
} |
|
|
|
- if (res == IDN2_OK) { |
|
+ int iresult; |
|
+ |
|
+ debug ("libidn_utf8_to_ascii"); |
|
+ res = idna_to_ascii_8z (utf8_str, &tmp_str, 0); |
|
+ free (utf8_str); |
|
+ |
|
+ if (res == IDNA_SUCCESS) { |
|
/* |
|
- * idn2_to_ascii_lz() normalizes all strings to lowerl case, |
|
+ * idna_to_ascii_8z() normalizes all strings to lowerl case, |
|
* but we generally don't want to lowercase all input strings; |
|
* make sure to return the original case if the two strings |
|
* differ only in case |
|
@@ -4786,26 +4796,26 @@ idn_locale_to_ace(const char *from, char *to, size_t tolen) { |
|
if (!strcasecmp(from, tmp_str)) { |
|
if (strlen(from) >= tolen) { |
|
debug("from string is too long"); |
|
- idn2_free(tmp_str); |
|
+ free(tmp_str); |
|
return ISC_R_NOSPACE; |
|
} |
|
- idn2_free(tmp_str); |
|
+ free(tmp_str); |
|
(void) strlcpy(to, from, tolen); |
|
return ISC_R_SUCCESS; |
|
} |
|
/* check the length */ |
|
if (strlen(tmp_str) >= tolen) { |
|
debug("ACE string is too long"); |
|
- idn2_free(tmp_str); |
|
+ free(tmp_str); |
|
return ISC_R_NOSPACE; |
|
} |
|
|
|
(void) strlcpy(to, tmp_str, tolen); |
|
- idn2_free(tmp_str); |
|
+ free(tmp_str); |
|
return ISC_R_SUCCESS; |
|
} |
|
|
|
- fatal("'%s' is not a legal IDN name (%s), use +noidnin", from, idn2_strerror(res)); |
|
+ fatal("'%s' is not a legal IDN name (%s), use +noidnin", from, idna_strerror (res)); |
|
return ISC_R_FAILURE; |
|
} |
|
|
|
@@ -4813,29 +4823,41 @@ idn_locale_to_ace(const char *from, char *to, size_t tolen) { |
|
static isc_result_t |
|
idn_ace_to_locale(const char *from, char *to, size_t tolen) { |
|
int res; |
|
+ char *tmp2 = NULL; |
|
char *tmp_str = NULL; |
|
|
|
- res = idn2_to_unicode_8zlz(from, &tmp_str, |
|
- IDN2_NONTRANSITIONAL|IDN2_NFC_INPUT); |
|
+ res = idna_to_unicode_8z8z (from, &tmp2, 0); |
|
+ if (res != IDNA_SUCCESS) { |
|
+ debug ("output_filter: %s", idna_strerror (res)); |
|
+ return ISC_R_SUCCESS; |
|
+ } |
|
+ |
|
+ tmp_str = stringprep_utf8_to_locale (tmp2); |
|
+ if (tmp_str == NULL) { |
|
+ debug ("output_filter: stringprep_utf8_to_locale failed"); |
|
+ res = idna_to_ascii_8z(tmp2, &tmp_str, 0); |
|
+ } |
|
+ |
|
+ free(tmp2); |
|
|
|
- if (res == IDN2_OK) { |
|
+ if (res == IDNA_SUCCESS) { |
|
/* check the length */ |
|
if (strlen(tmp_str) >= tolen) { |
|
debug("encoded ASC string is too long"); |
|
- idn2_free(tmp_str); |
|
+ free(tmp_str); |
|
return ISC_R_FAILURE; |
|
} |
|
|
|
(void) strlcpy(to, tmp_str, tolen); |
|
- idn2_free(tmp_str); |
|
+ free(tmp_str); |
|
return ISC_R_SUCCESS; |
|
} |
|
- |
|
- fatal("'%s' is not a legal IDN name (%s), use +noidnout", from, idn2_strerror(res)); |
|
+ // fatal("'%s' is not a legal IDN name (%s), use +noidnout", from, idna_strerror(res)); |
|
+ free(tmp_str); |
|
return ISC_R_FAILURE; |
|
} |
|
#endif /* WITH_IDN_OUT_SUPPORT */ |
|
-#endif /* WITH_LIBIDN2 */ |
|
+#endif /* WITH_LIBIDN */ |
|
#endif /* WITH_IDN_SUPPORT */ |
|
|
|
#ifdef DIG_SIGCHASE |
|
diff --git a/config.h.in b/config.h.in |
|
index 1dc65cf..9eb8a16 100644 |
|
--- a/config.h.in |
|
+++ b/config.h.in |
|
@@ -615,8 +615,8 @@ int sigwait(const unsigned int *set, int *sig); |
|
/* define if IDN input support is to be included. */ |
|
#undef WITH_IDN_SUPPORT |
|
|
|
-/* define if libidn2 support is to be included. */ |
|
-#undef WITH_LIBIDN2 |
|
+/* define if libidn support is to be included. */ |
|
+#undef WITH_LIBIDN |
|
|
|
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most |
|
significant byte first (like Motorola and SPARC, unlike Intel). */ |
|
diff --git a/configure.in b/configure.in |
|
index 9a1d16d..1397c50 100644 |
|
--- a/configure.in |
|
+++ b/configure.in |
|
@@ -4864,36 +4864,36 @@ fi |
|
AC_SUBST(IDNKIT_LIBS) |
|
|
|
# |
|
-# IDN support using libidn2 |
|
+# IDN support using libidn |
|
# |
|
|
|
-LIBIDN2_CFLAGS= |
|
-LIBIDN2_LDFLAGS= |
|
-LIBIDN2_LIBS= |
|
-AC_ARG_WITH(libidn2, |
|
- AS_HELP_STRING([--with-libidn2[=PATH]], [enable IDN support using GNU libidn2 [yes|no|path]]), |
|
- use_libidn2="$withval", use_libidn2="no") |
|
-AS_CASE([$use_libidn2], |
|
+LIBIDN_CFLAGS= |
|
+LIBIDN_LDFLAGS= |
|
+LIBIDN_LIBS= |
|
+AC_ARG_WITH(libidn, |
|
+ AS_HELP_STRING([--with-libidn[=PATH]], [enable IDN support using GNU libidn [yes|no|path]]), |
|
+ use_libidn="$withval", use_libidn="no") |
|
+AS_CASE([$use_libidn], |
|
[no],[:], |
|
[yes],[:], |
|
[*],[ |
|
- LIBIDN2_CFLAGS="-I$use_libidn2/include" |
|
- LIBIDN2_LDFLAGS="-L$use_libidn2/lib" |
|
+ LIBIDN_CFLAGS="-I$use_libidn/include" |
|
+ LIBIDN_LDFLAGS="-L$use_libidn/lib" |
|
]) |
|
|
|
-AS_IF([test "$use_libidn2" != "no"], |
|
+AS_IF([test "$use_libidn" != "no"], |
|
[save_CFLAGS="$CFLAGS" |
|
save_LIBS="$LIBS" |
|
save_LDFLAGS="$LDFLAGS" |
|
- CFLAGS="$LIBIDN2_CFLAGS $CFLAGS" |
|
- LDFLAGS="$LIBIDN2_LDFLAGS $LDFLAGS" |
|
- AC_SEARCH_LIBS([idn2_to_ascii_8z], [idn2], |
|
+ CFLAGS="$LIBIDN_CFLAGS $CFLAGS" |
|
+ LDFLAGS="$LIBIDN_LDFLAGS $LDFLAGS" |
|
+ AC_SEARCH_LIBS([idna_to_ascii_8z], [idn], |
|
[AC_DEFINE(WITH_IDN_SUPPORT, 1, [define if IDN input support is to be included.]) |
|
- AC_DEFINE(WITH_LIBIDN2, 1, [define if libidn2 support is to be included.]) |
|
- LIBIDN2_LIBS="$LIBIDN2_LDFLAGS -lidn2"], |
|
- [AC_MSG_ERROR([libidn2 requested, but not found])]) |
|
- AC_TRY_LINK([#include <idn2.h>], |
|
- [idn2_to_unicode_8zlz(".", NULL, IDN2_NONTRANSITIONAL|IDN2_NFC_INPUT);], |
|
+ AC_DEFINE(WITH_LIBIDN, 1, [define if libidn support is to be included.]) |
|
+ LIBIDN_LIBS="$LIBIDN_LDFLAGS -lidn"], |
|
+ [AC_MSG_ERROR([libidn requested, but not found])]) |
|
+ AC_TRY_LINK([#include <idna.h>], |
|
+ [idna_to_unicode_8zlz(".", NULL, 0);], |
|
[AC_MSG_RESULT(yes) |
|
AC_DEFINE(WITH_IDN_OUT_SUPPORT, 1, [define if IDN output support is to be included.])], |
|
[AC_MSG_RESULT([no])]) |
|
@@ -4901,21 +4901,21 @@ AS_IF([test "$use_libidn2" != "no"], |
|
LIBS="$save_LIBS" |
|
LDFLAGS="$save_LDFLAGS" |
|
]) |
|
-AC_SUBST([LIBIDN2_CFLAGS]) |
|
-AC_SUBST([LIBIDN2_LIBS]) |
|
+AC_SUBST([LIBIDN_CFLAGS]) |
|
+AC_SUBST([LIBIDN_LIBS]) |
|
|
|
# |
|
# IDN support in general |
|
# |
|
|
|
-# check if idnkit and libidn2 are not used at the same time |
|
-if test "$use_idnkit" != no && test "$use_libidn2" != no; then |
|
- AC_MSG_ERROR([idnkit and libidn2 cannot be used at the same time.]) |
|
+# check if idnkit and libidn are not used at the same time |
|
+if test "$use_idnkit" != no && test "$use_libidn" != no; then |
|
+ AC_MSG_ERROR([idnkit and libidn cannot be used at the same time.]) |
|
fi |
|
# the IDN support is on |
|
-if test "$use_idnkit" != no || test "$use_libidn2" != no; then |
|
+if test "$use_idnkit" != no || test "$use_libidn" != no; then |
|
AC_DEFINE(WITH_IDN_SUPPORT, 1, [define if IDN input support is to be included.]) |
|
- if test "$use_libidn2" = no || test "$use_libidn2_out" != no; then |
|
+ if test "$use_libidn" = no || test "$use_libidn_out" != no; then |
|
AC_DEFINE(WITH_IDN_OUT_SUPPORT, 1, [define if IDN output support is to be included.]) |
|
fi |
|
fi |
|
@@ -5618,7 +5618,7 @@ report() { |
|
test "X$JSONSTATS" = "X" || echo " JSON statistics (--with-libjson)" |
|
test "X$ZLIB" = "X" || echo " HTTP zlib compression (--with-zlib)" |
|
test "X$NZD_TOOLS" = "X" || echo " LMDB database to store configuration for 'addzone' zones (--with-lmdb)" |
|
- test "no" = "$use_libidn2" || echo " IDN support (--with-libidn2)" |
|
+ test "no" = "$use_libidn" || echo " IDN support (--with-libidn)" |
|
fi |
|
|
|
if test "no" != "$use_pkcs11"; then |
|
@@ -5716,7 +5716,7 @@ report() { |
|
test "X$JSONSTATS" = "X" && echo " JSON statistics (--with-libjson)" |
|
test "X$ZLIB" = "X" && echo " HTTP zlib compression (--with-zlib)" |
|
test "X$NZD_TOOLS" = "X" && echo " LMDB database to store configuration for 'addzone' zones (--with-lmdb)" |
|
- test "no" = "$use_libidn2" && echo " IDN support (--with-libidn2)" |
|
+ test "no" = "$use_libidn" && echo " IDN support (--with-libidn)" |
|
|
|
echo "-------------------------------------------------------------------------------" |
|
echo "Configured paths:" |
|
-- |
|
2.20.1 |
|
|
|
|