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.
304 lines
10 KiB
304 lines
10 KiB
5 years ago
|
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
|
||
|
|