From 0410b4e60f6b4b3a105c0866b797dc47a58ec594 Mon Sep 17 00:00:00 2001 From: Gustavo Lopes Date: Sun, 26 Aug 2012 23:37:09 +0200 Subject: [PATCH] Fixed defective cloning in ext/intl classes See also bug #62915 Cherry picked from 886a50a (I forgot about 5.3) Conflicts: ext/intl/spoofchecker/spoofchecker_class.c ext/intl/transliterator/transliterator_class.c --- NEWS | 1 + ext/intl/dateformat/dateformat_class.c | 2 +- ext/intl/formatter/formatter_class.c | 2 +- ext/intl/msgformat/msgformat_class.c | 2 +- ext/intl/tests/bug62915-2.phpt | 29 ++++++++++++++++++++++++++ 5 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 ext/intl/tests/bug62915-2.phpt diff --git a/NEWS b/NEWS index 69cbb2a0fa..cd7333cbb2 100644 --- a/NEWS +++ b/NEWS @@ -25,6 +25,7 @@ PHP NEWS - Intl: . Fix null pointer dereferences in some classes of ext/intl. (Gustavo) + . Fix bug #62915 (defective cloning in several intl classes). (Gustavo) - MySQLnd: . Fixed bug #62885 (mysqli_poll - Segmentation fault). (Laruence) diff --git a/ext/intl/dateformat/dateformat_class.c b/ext/intl/dateformat/dateformat_class.c index 85a67f7f9f..a7227ef03d 100644 --- a/ext/intl/dateformat/dateformat_class.c +++ b/ext/intl/dateformat/dateformat_class.c @@ -91,7 +91,7 @@ zend_object_value IntlDateFormatter_object_clone(zval *object TSRMLS_DC) DATE_FORMAT_METHOD_FETCH_OBJECT_NO_CHECK; - new_obj_val = IntlDateFormatter_ce_ptr->create_object(IntlDateFormatter_ce_ptr TSRMLS_CC); + new_obj_val = IntlDateFormatter_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC); new_dfo = (IntlDateFormatter_object *)zend_object_store_get_object_by_handle(new_obj_val.handle TSRMLS_CC); /* clone standard parts */ zend_objects_clone_members(&new_dfo->zo, new_obj_val, &dfo->zo, handle TSRMLS_CC); diff --git a/ext/intl/formatter/formatter_class.c b/ext/intl/formatter/formatter_class.c index 5790f0c2e1..9de1e1e96e 100644 --- a/ext/intl/formatter/formatter_class.c +++ b/ext/intl/formatter/formatter_class.c @@ -85,7 +85,7 @@ zend_object_value NumberFormatter_object_clone(zval *object TSRMLS_DC) NumberFormatter_object *nfo, *new_nfo; FORMATTER_METHOD_FETCH_OBJECT_NO_CHECK; - new_obj_val = NumberFormatter_ce_ptr->create_object(NumberFormatter_ce_ptr TSRMLS_CC); + new_obj_val = NumberFormatter_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC); new_nfo = (NumberFormatter_object *)zend_object_store_get_object_by_handle(new_obj_val.handle TSRMLS_CC); /* clone standard parts */ zend_objects_clone_members(&new_nfo->zo, new_obj_val, &nfo->zo, handle TSRMLS_CC); diff --git a/ext/intl/msgformat/msgformat_class.c b/ext/intl/msgformat/msgformat_class.c index 36d06d2d36..d6ba9b1c67 100644 --- a/ext/intl/msgformat/msgformat_class.c +++ b/ext/intl/msgformat/msgformat_class.c @@ -83,7 +83,7 @@ zend_object_value MessageFormatter_object_clone(zval *object TSRMLS_DC) MessageFormatter_object *mfo, *new_mfo; MSG_FORMAT_METHOD_FETCH_OBJECT_NO_CHECK; - new_obj_val = MessageFormatter_ce_ptr->create_object(MessageFormatter_ce_ptr TSRMLS_CC); + new_obj_val = MessageFormatter_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC); new_mfo = (MessageFormatter_object *)zend_object_store_get_object_by_handle(new_obj_val.handle TSRMLS_CC); /* clone standard parts */ zend_objects_clone_members(&new_mfo->zo, new_obj_val, &mfo->zo, handle TSRMLS_CC); diff --git a/ext/intl/tests/bug62915-2.phpt b/ext/intl/tests/bug62915-2.phpt new file mode 100644 index 0000000000..6bccf38ff9 --- /dev/null +++ b/ext/intl/tests/bug62915-2.phpt @@ -0,0 +1,29 @@ +--TEST-- +Bug #62915: cloning of several classes is defective +--SKIPIF-- +newInstanceArgs($subclass::$ARGS); + $clone = clone $obj; + var_dump(get_class($clone)); +} +--EXPECT-- +string(1) "A" +string(1) "B" +string(1) "C" -- 2.40.0