summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmb@php.net>2016-07-12 14:51:23 +0200
committerChristoph M. Becker <cmb@php.net>2016-07-12 14:52:23 +0200
commit5fbcc2b90f6245cf1c20d41d2cd07fde711ccadd (patch)
tree9dba25ece0d9d20383d719116c6fc75092019494
parentaabca89f951984c0a8d68520dfefb499f89735a8 (diff)
parent76e249d31c51d0b4f8f11507c550ca1eec1dd38a (diff)
downloadphp-git-5fbcc2b90f6245cf1c20d41d2cd07fde711ccadd.tar.gz
Merge branch 'PHP-5.6' into PHP-7.0
# Resolved conflicts: # ext/intl/idn/idn.c
-rw-r--r--NEWS4
-rw-r--r--ext/intl/idn/idn.c5
-rw-r--r--ext/intl/tests/bug72506.phpt37
3 files changed, 42 insertions, 4 deletions
diff --git a/NEWS b/NEWS
index 31cbca4370..b87aed3d03 100644
--- a/NEWS
+++ b/NEWS
@@ -23,6 +23,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)
+
- PDO:
. Fixed bug #52384 (Adds bound parameter value to PDOStatement::debugDumpParams).
(bishopb)
diff --git a/ext/intl/idn/idn.c b/ext/intl/idn/idn.c
index 6e699604df..cb23edd0c5 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, 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) {
- php_error_docref(NULL, E_ERROR, "ICU returned an unexpected length");
- }
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) {
+}