summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS4
-rw-r--r--ext/intl/idn/idn.c8
-rw-r--r--ext/intl/tests/bug72506.phpt37
3 files changed, 42 insertions, 7 deletions
diff --git a/NEWS b/NEWS
index 1adba64664..3fbb899a77 100644
--- a/NEWS
+++ b/NEWS
@@ -27,6 +27,10 @@ PHP NEWS
. Fixed bug #72575 (using --allow-to-run-as-root should ignore missing user).
(gooh)
+- Intl:
+ . Partially fixed #72506 (idn_to_ascii for UTS #46 incorrect for long domain
+ names). (cmb)
+
- Mbstring:
. Deprecated mb_ereg_replace() eval option. (Rouven Weßling, cmb)
diff --git a/ext/intl/idn/idn.c b/ext/intl/idn/idn.c
index 1489dab9b1..cb23edd0c5 100644
--- a/ext/intl/idn/idn.c
+++ b/ext/intl/idn/idn.c
@@ -158,18 +158,12 @@ static void php_intl_idn_to_46(INTERNAL_FUNCTION_PARAMETERS,
len = uidna_nameToUnicodeUTF8(uts46, domain, domain_len,
ZSTR_VAL(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) == FAILURE) {
uidna_close(uts46);
zend_string_free(buffer);
RETURN_FALSE;
}
- if (len >= 255) {
- zend_throw_error(NULL, "ICU returned an unexpected length");
- uidna_close(uts46);
- zend_string_free(buffer);
- RETURN_FALSE;
- }
ZSTR_VAL(buffer)[len] = '\0';
ZSTR_LEN(buffer) = len;
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) {
+}