diff --git a/NEWS b/NEWS index b62200e4c06a..a2b199651322 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,10 @@ PHP NEWS . Fixed bug GH-15375 (Nested "yield from" skips items after a valid() or next() call on the inner generator). (iliaal) +- Intl: + . Fixed a crash when converting with a cloned UConverter that uses + toUCallback/fromUCallback. (iliaal) + - Opcache: . Fixed opcache.protect_memory race under ZTS. (realFlowControl) diff --git a/ext/intl/converter/converter.c b/ext/intl/converter/converter.c index 759db5e18873..6ba2ed9a08e7 100644 --- a/ext/intl/converter/converter.c +++ b/ext/intl/converter/converter.c @@ -961,6 +961,9 @@ static zend_object *php_converter_clone_object(zend_object *object) { zend_objects_clone_members(&(objval->obj), &(oldobj->obj)); + php_converter_resolve_callback(&objval->to_cache, &objval->obj, ZEND_STRL("toUCallback")); + php_converter_resolve_callback(&objval->from_cache, &objval->obj, ZEND_STRL("fromUCallback")); + /* Newly cloned object deliberately does not inherit error state from original object */ return retval; diff --git a/ext/intl/tests/uconverter_clone_callback.phpt b/ext/intl/tests/uconverter_clone_callback.phpt new file mode 100644 index 000000000000..140841b455e5 --- /dev/null +++ b/ext/intl/tests/uconverter_clone_callback.phpt @@ -0,0 +1,24 @@ +--TEST-- +Cloned UConverter resolves toUCallback/fromUCallback on the clone +--EXTENSIONS-- +intl +--FILE-- +hits++; + return parent::toUCallback($reason, $source, $codeUnits, $error); + } +} + +$orig = new MyConverter('ascii', 'utf-8'); +$clone = clone $orig; +$clone->convert("irregul\xC1\xA1r"); +echo $clone->hits > 0 ? "ok\n" : "no callback\n"; + +?> +--EXPECT-- +ok