]> granicus.if.org Git - php/commitdiff
Partially fix #72506: idn_to_ascii for UTS #46 incorrect for long domain names
authorChristoph M. Becker <cmb@php.net>
Tue, 12 Jul 2016 12:42:38 +0000 (14:42 +0200)
committerChristoph M. Becker <cmb@php.net>
Tue, 12 Jul 2016 12:47:14 +0000 (14:47 +0200)
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.

NEWS
ext/intl/idn/idn.c
ext/intl/tests/bug72506.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 154d14903be6d36ab8d7f1f663e5653418cd989c..6cb61d4916c4ead6a77ab29c935fbb9990670dd4 100644 (file)
--- 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)
index 6332488cc9c3d5347fb0e5405d581e98e9d3cd96..fb17e3445cf33c7d54b94c48fc8d9ca20cedf844 100644 (file)
@@ -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 (file)
index 0000000..a7c561c
--- /dev/null
@@ -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) {
+}