Commit:    886a50a619e55c9c1a5597449d6c71c69ff6fef8
Author:    Gustavo Lopes <[email protected]>         Sun, 26 Aug 2012 
23:37:09 +0200
Parents:   63a1801d195441bc681ff20ecf9dddac787824d8
Branches:  PHP-5.4 master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=886a50a619e55c9c1a5597449d6c71c69ff6fef8

Log:
Fixed defective cloning in ext/intl classes

See also bug #62915

Bugs:
https://bugs.php.net/62915

Changed paths:
  M  ext/intl/dateformat/dateformat_class.c
  M  ext/intl/formatter/formatter_class.c
  M  ext/intl/msgformat/msgformat_class.c
  M  ext/intl/spoofchecker/spoofchecker_class.c
  A  ext/intl/tests/bug62915-2.phpt
  M  ext/intl/transliterator/transliterator_class.c


Diff:
diff --git a/ext/intl/dateformat/dateformat_class.c 
b/ext/intl/dateformat/dateformat_class.c
index 801ca33..49f316f 100644
--- a/ext/intl/dateformat/dateformat_class.c
+++ b/ext/intl/dateformat/dateformat_class.c
@@ -92,7 +92,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 8f399a6..2246cd2 100644
--- a/ext/intl/formatter/formatter_class.c
+++ b/ext/intl/formatter/formatter_class.c
@@ -86,7 +86,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 da1e1e5..bb3b55f 100644
--- a/ext/intl/msgformat/msgformat_class.c
+++ b/ext/intl/msgformat/msgformat_class.c
@@ -84,7 +84,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/spoofchecker/spoofchecker_class.c 
b/ext/intl/spoofchecker/spoofchecker_class.c
index 507a2ca..6c2b790 100644
--- a/ext/intl/spoofchecker/spoofchecker_class.c
+++ b/ext/intl/spoofchecker/spoofchecker_class.c
@@ -127,7 +127,7 @@ static zend_object_value spoofchecker_clone_obj(zval 
*object TSRMLS_DC) /* {{{ *
     sfo = (Spoofchecker_object *) zend_object_store_get_object(object 
TSRMLS_CC);
     intl_error_reset(SPOOFCHECKER_ERROR_P(sfo) TSRMLS_CC);
 
-       new_obj_val = Spoofchecker_ce_ptr->create_object(Spoofchecker_ce_ptr 
TSRMLS_CC);
+       new_obj_val = Spoofchecker_ce_ptr->create_object(Z_OBJCE_P(object) 
TSRMLS_CC);
        new_sfo = (Spoofchecker_object 
*)zend_object_store_get_object_by_handle(new_obj_val.handle TSRMLS_CC);
        /* clone standard parts */      
        zend_objects_clone_members(&new_sfo->zo, new_obj_val, &sfo->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 0000000..bcb069c
--- /dev/null
+++ b/ext/intl/tests/bug62915-2.phpt
@@ -0,0 +1,33 @@
+--TEST--
+Bug #62915: cloning of several classes is defective
+--SKIPIF--
+<?php
+if (!extension_loaded('intl'))
+           die('skip intl extension not enabled');
+--FILE--
+<?php
+class A extends IntlDateFormatter {
+               static $ARGS = array("en_US" ,IntlDateFormatter::FULL, 
IntlDateFormatter::FULL,
+                   'America/Los_Angeles', IntlDateFormatter::GREGORIAN);
+}
+class B extends NumberFormatter {
+               static $ARGS = array('de_DE', NumberFormatter::DECIMAL);
+}
+class C extends MessageFormatter {
+               static $ARGS = array("en_US", "foo");
+}
+class D extends Spoofchecker {
+               static $ARGS = array();
+}
+
+foreach (range('A', 'D') as $subclass) {
+               $rc = new ReflectionClass($subclass);
+                       $obj = $rc->newInstanceArgs($subclass::$ARGS);
+                               $clone = clone $obj;
+                                       var_dump(get_class($clone));
+}
+--EXPECT--
+string(1) "A"
+string(1) "B"
+string(1) "C"
+string(1) "D"
diff --git a/ext/intl/transliterator/transliterator_class.c 
b/ext/intl/transliterator/transliterator_class.c
index 8d4d064..5ef80fb 100644
--- a/ext/intl/transliterator/transliterator_class.c
+++ b/ext/intl/transliterator/transliterator_class.c
@@ -162,7 +162,7 @@ static zend_object_value Transliterator_clone_obj( zval 
*object TSRMLS_DC )
 
        to_orig = zend_object_store_get_object( object TSRMLS_CC );
        intl_error_reset( INTL_DATA_ERROR_P( to_orig ) TSRMLS_CC );
-       ret_val = Transliterator_ce_ptr->create_object( Transliterator_ce_ptr 
TSRMLS_CC );
+       ret_val = Transliterator_ce_ptr->create_object( Z_OBJCE_P( object ) 
TSRMLS_CC );
        to_new  = zend_object_store_get_object_by_handle( ret_val.handle 
TSRMLS_CC );
 
        zend_objects_clone_members( &to_new->zo, ret_val,


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to