Skip to content

Commit 0410b4e

Browse files
committed
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
1 parent d92a89f commit 0410b4e

File tree

5 files changed

+33
-3
lines changed

5 files changed

+33
-3
lines changed

NEWS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ PHP NEWS
2525

2626
- Intl:
2727
. Fix null pointer dereferences in some classes of ext/intl. (Gustavo)
28+
. Fix bug #62915 (defective cloning in several intl classes). (Gustavo)
2829

2930
- MySQLnd:
3031
. Fixed bug #62885 (mysqli_poll - Segmentation fault). (Laruence)

ext/intl/dateformat/dateformat_class.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ zend_object_value IntlDateFormatter_object_clone(zval *object TSRMLS_DC)
9191

9292
DATE_FORMAT_METHOD_FETCH_OBJECT_NO_CHECK;
9393

94-
new_obj_val = IntlDateFormatter_ce_ptr->create_object(IntlDateFormatter_ce_ptr TSRMLS_CC);
94+
new_obj_val = IntlDateFormatter_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC);
9595
new_dfo = (IntlDateFormatter_object *)zend_object_store_get_object_by_handle(new_obj_val.handle TSRMLS_CC);
9696
/* clone standard parts */
9797
zend_objects_clone_members(&new_dfo->zo, new_obj_val, &dfo->zo, handle TSRMLS_CC);

ext/intl/formatter/formatter_class.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ zend_object_value NumberFormatter_object_clone(zval *object TSRMLS_DC)
8585
NumberFormatter_object *nfo, *new_nfo;
8686

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

ext/intl/msgformat/msgformat_class.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ zend_object_value MessageFormatter_object_clone(zval *object TSRMLS_DC)
8383
MessageFormatter_object *mfo, *new_mfo;
8484

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

ext/intl/tests/bug62915-2.phpt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
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+
20+
foreach (range('A', 'C') as $subclass) {
21+
$rc = new ReflectionClass($subclass);
22+
$obj = $rc->newInstanceArgs($subclass::$ARGS);
23+
$clone = clone $obj;
24+
var_dump(get_class($clone));
25+
}
26+
--EXPECT--
27+
string(1) "A"
28+
string(1) "B"
29+
string(1) "C"

0 commit comments

Comments
 (0)