]> granicus.if.org Git - php/commitdiff
Fixed #75317 - UConverter::setDestinationEncoding changes source instead of destinati...
authorNester <andrew.nester.dev@gmail.com>
Mon, 9 Oct 2017 14:26:44 +0000 (14:26 +0000)
committerJoe Watkins <krakjoe@php.net>
Thu, 19 Oct 2017 11:02:22 +0000 (12:02 +0100)
NEWS
ext/intl/converter/converter.c
ext/intl/tests/bug75317.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 8d451c6e89b0ea26fbec2e0cdc1fc03ea149a298..8e8f6af4bb6eef1fe837f3a42eda223f7a5bba6c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -19,6 +19,10 @@ PHP                                                                        NEWS
   . Fixed bug #75301 (Exif extension has built in revision version). (Peter
     Kokot)
 
+- intl:
+  . Fixed bug #75317 (UConverter::setDestinationEncoding changes source instead 
+    of destination). (andrewnester)
+
 - OCI8:
   . Fixed valgrind issue. (Tianfang Yang)
 
index 2b5cf98ae87a6812c8a41a5849bb407dbf843b10..537a8e5d500e24ecd34d0e3aaba2269d84928c65 100644 (file)
@@ -411,7 +411,7 @@ static zend_bool php_converter_set_encoding(php_converter_object *objval,
 ZEND_BEGIN_ARG_INFO_EX(php_converter_set_encoding_arginfo, 0, ZEND_RETURN_VALUE, 1)
        ZEND_ARG_INFO(0, encoding)
 ZEND_END_ARG_INFO();
-static void php_converter_do_set_encoding(UConverter *cnv, INTERNAL_FUNCTION_PARAMETERS) {
+static void php_converter_do_set_encoding(UConverter **pcnv, INTERNAL_FUNCTION_PARAMETERS) {
        php_converter_object *objval = CONV_GET(getThis());
        char *enc;
        size_t enc_len;
@@ -423,21 +423,21 @@ static void php_converter_do_set_encoding(UConverter *cnv, INTERNAL_FUNCTION_PAR
        }
        intl_errors_reset(&objval->error);
 
-       RETURN_BOOL(php_converter_set_encoding(objval, &(objval->src), enc, enc_len));
+       RETURN_BOOL(php_converter_set_encoding(objval, pcnv, enc, enc_len));
 }
 /* }}} */
 
 /* {{{ proto bool UConverter::setSourceEncoding(string encoding) */
 static PHP_METHOD(UConverter, setSourceEncoding) {
        php_converter_object *objval = CONV_GET(getThis());
-       php_converter_do_set_encoding(objval->src, INTERNAL_FUNCTION_PARAM_PASSTHRU);
+       php_converter_do_set_encoding(&(objval->src), INTERNAL_FUNCTION_PARAM_PASSTHRU);
 }
 /* }}} */
 
 /* {{{ proto bool UConverter::setDestinationEncoding(string encoding) */
 static PHP_METHOD(UConverter, setDestinationEncoding) {
        php_converter_object *objval = CONV_GET(getThis());
-       php_converter_do_set_encoding(objval->dest, INTERNAL_FUNCTION_PARAM_PASSTHRU);
+       php_converter_do_set_encoding(&(objval->dest), INTERNAL_FUNCTION_PARAM_PASSTHRU);
 }
 /* }}} */
 
diff --git a/ext/intl/tests/bug75317.phpt b/ext/intl/tests/bug75317.phpt
new file mode 100644 (file)
index 0000000..cbd9605
--- /dev/null
@@ -0,0 +1,53 @@
+--TEST--
+Bug #75317 (UConverter::setDestinationEncoding changes source instead of destinatination)
+--SKIPIF--
+<?php
+if (!extension_loaded('intl')) die('skip intl extension is not available');
+?>
+--FILE--
+<?php
+$utf8 = UConverter::getAliases('utf-8')[0];
+$utf16 = UConverter::getAliases('utf-16')[0];
+$utf32 = UConverter::getAliases('utf-32')[0];
+$latin1 = UConverter::getAliases('latin1')[0];
+
+function printResult($actual, $expected) {
+    var_dump($actual === $expected ? true : "expected: $expected, actual: $actual");
+}
+
+// test default values
+$c = new UConverter();
+printResult($c->getDestinationEncoding(), $utf8);
+printResult($c->getSourceEncoding(), $utf8);
+
+// test constructor args
+$c = new UConverter('utf-16', 'latin1');
+printResult($c->getDestinationEncoding(), $utf16);
+printResult($c->getSourceEncoding(), $latin1);
+
+// test setters
+var_dump($c->setDestinationEncoding('utf-8'));
+var_dump($c->setSourceEncoding('utf-32'));
+printResult($c->getDestinationEncoding(), $utf8);
+printResult($c->getSourceEncoding(), $utf32);
+
+// test invalid inputs dont change values
+var_dump($c->setDestinationEncoding('foobar') === false);
+var_dump($c->setSourceEncoding('foobar') === false);
+printResult($c->getDestinationEncoding(), $utf8);
+printResult($c->getSourceEncoding(), $utf32);
+
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
\ No newline at end of file