util.encodings: Switch ICU binding to IDNA2008 (fixes #533, #1301)
authorKim Alvefur <zash@zash.se>
Wed, 11 Sep 2019 00:14:59 +0200
changeset 10265 010c67532ed0
parent 10264 d6b9cacfef76
child 10266 b1209bc15cd1
util.encodings: Switch ICU binding to IDNA2008 (fixes #533, #1301)
util-src/encodings.c
--- a/util-src/encodings.c	Thu Sep 12 15:17:12 2019 +0200
+++ b/util-src/encodings.c	Wed Sep 11 00:14:59 2019 +0200
@@ -269,6 +269,7 @@
 #include <unicode/ustring.h>
 #include <unicode/utrace.h>
 #include <unicode/uspoof.h>
+#include <unicode/uidna.h>
 
 static int icu_stringprep_prep(lua_State *L, const UStringPrepProfile *profile) {
 	size_t input_len;
@@ -323,6 +324,7 @@
 UStringPrepProfile *icu_resourceprep;
 UStringPrepProfile *icu_saslprep;
 USpoofChecker *icu_spoofcheck;
+UIDNA *icu_idna2008;
 
 #if (U_ICU_VERSION_MAJOR_NUM < 58)
 /* COMPAT */
@@ -339,6 +341,7 @@
 	icu_saslprep = usprep_openByType(USPREP_RFC4013_SASLPREP, &err);
 	icu_spoofcheck = uspoof_open(&err);
 	uspoof_setChecks(icu_spoofcheck, USPOOF_CONFUSABLE, &err);
+	icu_idna2008 = uidna_openUTS46(UIDNA_USE_STD3_RULES, &err);
 
 	if(U_FAILURE(err)) {
 		fprintf(stderr, "[c] util.encodings: error: %s\n", u_errorName((UErrorCode)err));
@@ -434,9 +437,10 @@
 		return 1;
 	}
 
-	dest_len = uidna_IDNToASCII(ustr, ulen, dest, 1024, UIDNA_USE_STD3_RULES, NULL, &err);
+	UIDNAInfo info = UIDNA_INFO_INITIALIZER;
+	dest_len = uidna_nameToASCII(icu_idna2008, ustr, ulen, dest, 256, &info, &err);
 
-	if(U_FAILURE(err)) {
+	if(U_FAILURE(err) || info.errors) {
 		lua_pushnil(L);
 		return 1;
 	} else {
@@ -468,9 +472,10 @@
 		return 1;
 	}
 
-	dest_len = uidna_IDNToUnicode(ustr, ulen, dest, 1024, UIDNA_USE_STD3_RULES, NULL, &err);
+	UIDNAInfo info = UIDNA_INFO_INITIALIZER;
+	dest_len = uidna_nameToUnicode(icu_idna2008, ustr, ulen, dest, 1024, &info, &err);
 
-	if(U_FAILURE(err)) {
+	if(U_FAILURE(err) || info.errors) {
 		lua_pushnil(L);
 		return 1;
 	} else {