Skip to content

Commit befe4ab

Browse files
committed
Merge branch 'PHP-5.4'
* PHP-5.4: Fixed defective cloning in ext/intl classes NEWS for commit 72c807a Allow Spoofchecker to be registered on ICU 49.1 Announce on NEWS change in 1ce572c
2 parents 011af74 + 886a50a commit befe4ab

File tree

7 files changed

+40
-7
lines changed

7 files changed

+40
-7
lines changed

ext/intl/dateformat/dateformat_class.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ zend_object_value IntlDateFormatter_object_clone(zval *object TSRMLS_DC)
9494

9595
DATE_FORMAT_METHOD_FETCH_OBJECT_NO_CHECK;
9696

97-
new_obj_val = IntlDateFormatter_ce_ptr->create_object(IntlDateFormatter_ce_ptr TSRMLS_CC);
97+
new_obj_val = IntlDateFormatter_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC);
9898
new_dfo = (IntlDateFormatter_object *)zend_object_store_get_object_by_handle(new_obj_val.handle TSRMLS_CC);
9999
/* clone standard parts */
100100
zend_objects_clone_members(&new_dfo->zo, new_obj_val, &dfo->zo, handle TSRMLS_CC);

ext/intl/formatter/formatter_class.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ zend_object_value NumberFormatter_object_clone(zval *object TSRMLS_DC)
8686
NumberFormatter_object *nfo, *new_nfo;
8787

8888
FORMATTER_METHOD_FETCH_OBJECT_NO_CHECK;
89-
new_obj_val = NumberFormatter_ce_ptr->create_object(NumberFormatter_ce_ptr TSRMLS_CC);
89+
new_obj_val = NumberFormatter_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC);
9090
new_nfo = (NumberFormatter_object *)zend_object_store_get_object_by_handle(new_obj_val.handle TSRMLS_CC);
9191
/* clone standard parts */
9292
zend_objects_clone_members(&new_nfo->zo, new_obj_val, &nfo->zo, handle TSRMLS_CC);

ext/intl/msgformat/msgformat_class.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ zend_object_value MessageFormatter_object_clone(zval *object TSRMLS_DC)
8484
MessageFormatter_object *mfo, *new_mfo;
8585

8686
MSG_FORMAT_METHOD_FETCH_OBJECT_NO_CHECK;
87-
new_obj_val = MessageFormatter_ce_ptr->create_object(MessageFormatter_ce_ptr TSRMLS_CC);
87+
new_obj_val = MessageFormatter_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC);
8888
new_mfo = (MessageFormatter_object *)zend_object_store_get_object_by_handle(new_obj_val.handle TSRMLS_CC);
8989
/* clone standard parts */
9090
zend_objects_clone_members(&new_mfo->zo, new_obj_val, &mfo->zo, handle TSRMLS_CC);

ext/intl/php_intl.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@
8484

8585
#include "idn/idn.h"
8686

87-
#if U_ICU_VERSION_MAJOR_NUM > 3 && U_ICU_VERSION_MINOR_NUM >=2
87+
#if U_ICU_VERSION_MAJOR_NUM * 1000 + U_ICU_VERSION_MINOR_NUM >= 4002
8888
# include "spoofchecker/spoofchecker_class.h"
8989
# include "spoofchecker/spoofchecker.h"
9090
# include "spoofchecker/spoofchecker_create.h"
@@ -963,7 +963,7 @@ PHP_MINIT_FUNCTION( intl )
963963
/* Expose IDN constants to PHP scripts. */
964964
idn_register_constants(INIT_FUNC_ARGS_PASSTHRU);
965965

966-
#if U_ICU_VERSION_MAJOR_NUM > 3 && U_ICU_VERSION_MINOR_NUM >=2
966+
#if U_ICU_VERSION_MAJOR_NUM * 1000 + U_ICU_VERSION_MINOR_NUM >= 4002
967967
/* Register 'Spoofchecker' PHP class */
968968
spoofchecker_register_Spoofchecker_class( TSRMLS_C );
969969

ext/intl/spoofchecker/spoofchecker_class.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ static zend_object_value spoofchecker_clone_obj(zval *object TSRMLS_DC) /* {{{ *
127127
sfo = (Spoofchecker_object *) zend_object_store_get_object(object TSRMLS_CC);
128128
intl_error_reset(SPOOFCHECKER_ERROR_P(sfo) TSRMLS_CC);
129129

130-
new_obj_val = Spoofchecker_ce_ptr->create_object(Spoofchecker_ce_ptr TSRMLS_CC);
130+
new_obj_val = Spoofchecker_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC);
131131
new_sfo = (Spoofchecker_object *)zend_object_store_get_object_by_handle(new_obj_val.handle TSRMLS_CC);
132132
/* clone standard parts */
133133
zend_objects_clone_members(&new_sfo->zo, new_obj_val, &sfo->zo, handle TSRMLS_CC);

ext/intl/tests/bug62915-2.phpt

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
--TEST--
2+
Bug #62915: cloning of several classes is defective
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('intl'))
6+
die('skip intl extension not enabled');
7+
--FILE--
8+
<?php
9+
class A extends IntlDateFormatter {
10+
static $ARGS = array("en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
11+
'America/Los_Angeles', IntlDateFormatter::GREGORIAN);
12+
}
13+
class B extends NumberFormatter {
14+
static $ARGS = array('de_DE', NumberFormatter::DECIMAL);
15+
}
16+
class C extends MessageFormatter {
17+
static $ARGS = array("en_US", "foo");
18+
}
19+
class D extends Spoofchecker {
20+
static $ARGS = array();
21+
}
22+
23+
foreach (range('A', 'D') as $subclass) {
24+
$rc = new ReflectionClass($subclass);
25+
$obj = $rc->newInstanceArgs($subclass::$ARGS);
26+
$clone = clone $obj;
27+
var_dump(get_class($clone));
28+
}
29+
--EXPECT--
30+
string(1) "A"
31+
string(1) "B"
32+
string(1) "C"
33+
string(1) "D"

ext/intl/transliterator/transliterator_class.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ static zend_object_value Transliterator_clone_obj( zval *object TSRMLS_DC )
162162

163163
to_orig = zend_object_store_get_object( object TSRMLS_CC );
164164
intl_error_reset( INTL_DATA_ERROR_P( to_orig ) TSRMLS_CC );
165-
ret_val = Transliterator_ce_ptr->create_object( Transliterator_ce_ptr TSRMLS_CC );
165+
ret_val = Transliterator_ce_ptr->create_object( Z_OBJCE_P( object ) TSRMLS_CC );
166166
to_new = zend_object_store_get_object_by_handle( ret_val.handle TSRMLS_CC );
167167

168168
zend_objects_clone_members( &to_new->zo, ret_val,

0 commit comments

Comments
 (0)