diff options
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | ext/intl/idn/idn.c | 5 | ||||
-rw-r--r-- | ext/intl/tests/bug72506.phpt | 37 |
3 files changed, 42 insertions, 4 deletions
@@ -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) { +} |