summaryrefslogtreecommitdiff
path: root/ext/intl
diff options
context:
space:
mode:
authorChristoph M. Becker <cmb@php.net>2016-07-12 14:42:38 +0200
committerChristoph M. Becker <cmb@php.net>2016-07-12 14:47:14 +0200
commit76e249d31c51d0b4f8f11507c550ca1eec1dd38a (patch)
treec67dd4d9b8f1ebe273cc5bb42e3e6df187acfadd /ext/intl
parent17d4f5c2f83469764de63b221d2314ac3443d8db (diff)
downloadphp-git-76e249d31c51d0b4f8f11507c550ca1eec1dd38a.tar.gz
Partially fix #72506: idn_to_ascii for UTS #46 incorrect for long domain names
We don't actually fix this issue wrt. the empty $info array, because it is not clear what this array should contain and we're concerned about the potential BC break, but at least we fix the inconsistent handling of resulting domains with 255 bytes (which raise an error), and longer domains (which just return FALSE), what has to be considered a very minor BC break if at all.
Diffstat (limited to 'ext/intl')
-rw-r--r--ext/intl/idn/idn.c5
-rw-r--r--ext/intl/tests/bug72506.phpt37
2 files changed, 38 insertions, 4 deletions
diff --git a/ext/intl/idn/idn.c b/ext/intl/idn/idn.c
index 6332488cc9..fb17e3445c 100644
--- a/ext/intl/idn/idn.c
+++ b/ext/intl/idn/idn.c
@@ -158,15 +158,12 @@ static void php_intl_idn_to_46(INTERNAL_FUNCTION_PARAMETERS,
len = uidna_nameToUnicodeUTF8(uts46, domain, (int32_t)domain_len,
buffer, buffer_capac, &info, &status);
}
- if (php_intl_idn_check_status(status, "failed to convert name",
+ if (len >= 255 || php_intl_idn_check_status(status, "failed to convert name",
mode TSRMLS_CC) == FAILURE) {
uidna_close(uts46);
efree(buffer);
RETURN_FALSE;
}
- if (len >= 255) {
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "ICU returned an unexpected length");
- }
buffer[len] = '\0';
diff --git a/ext/intl/tests/bug72506.phpt b/ext/intl/tests/bug72506.phpt
new file mode 100644
index 0000000000..a7c561c740
--- /dev/null
+++ b/ext/intl/tests/bug72506.phpt
@@ -0,0 +1,37 @@
+--TEST--
+Bug #72506 (idn_to_ascii with INTL_IDNA_VARIANT_UTS46 fatals for long domain names)
+--DESCRIPTION--
+Actually, the $info array should be populated for these cases, but at least it's
+not clear yet with which values exactly.
+--SKIPIF--
+<?php
+if (!extension_loaded('intl')) die('skip this test requires ext/intl');
+if (!defined('INTL_IDNA_VARIANT_UTS46')) die('skip no UTS #46 API');
+?>
+--FILE--
+<?php
+// ASCII domain name with 255 characters
+$domain = str_repeat('a.', 126) . 'aaa';
+$result = idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46, $info);
+var_dump($result, $info);
+
+// ASCII domain name with 256 characters – one character added
+$domain .= 'a';
+$result = idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46, $info);
+var_dump($result, $info);
+
+// International domain name with cyrillic "ф" characters
+$domain = str_repeat('ф.', 32) . 'a';
+$result = idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46, $info);
+var_dump($result, $info);
+?>
+--EXPECT--
+bool(false)
+array(0) {
+}
+bool(false)
+array(0) {
+}
+bool(false)
+array(0) {
+}