mirror of
https://github.com/php/php-src.git
synced 2025-08-15 13:38:49 +02:00
Fix IntlDateFormatter::parseToCalendar() reference type system breaks
Closes GH-18440.
This commit is contained in:
parent
d00adca199
commit
173dccb646
3 changed files with 33 additions and 6 deletions
2
NEWS
2
NEWS
|
@ -9,6 +9,8 @@ PHP NEWS
|
||||||
|
|
||||||
- Intl:
|
- Intl:
|
||||||
. datefmt_parse/datefmt_localtime references type system fixes. (nielsdos)
|
. datefmt_parse/datefmt_localtime references type system fixes. (nielsdos)
|
||||||
|
. Fix IntlDateFormatter::parseToCalendar() reference type system breaks.
|
||||||
|
(nielsdos)
|
||||||
|
|
||||||
- SPL:
|
- SPL:
|
||||||
. Fixed bug GH-18421 (Integer overflow with large numbers in LimitIterator).
|
. Fixed bug GH-18421 (Integer overflow with large numbers in LimitIterator).
|
||||||
|
|
|
@ -185,12 +185,12 @@ PHP_METHOD(IntlDateFormatter, parseToCalendar)
|
||||||
DATE_FORMAT_METHOD_FETCH_OBJECT;
|
DATE_FORMAT_METHOD_FETCH_OBJECT;
|
||||||
|
|
||||||
if (z_parse_pos) {
|
if (z_parse_pos) {
|
||||||
zend_long long_parse_pos;
|
zval *z_parse_pos_tmp = z_parse_pos;
|
||||||
ZVAL_DEREF(z_parse_pos);
|
ZVAL_DEREF(z_parse_pos_tmp);
|
||||||
bool failed = false;
|
bool failed = false;
|
||||||
long_parse_pos = zval_try_get_long(z_parse_pos, &failed);
|
zend_long long_parse_pos = zval_try_get_long(z_parse_pos_tmp, &failed);
|
||||||
if (failed) {
|
if (failed) {
|
||||||
zend_argument_type_error(2, "must be of type int, %s given", zend_zval_value_name(z_parse_pos));
|
zend_argument_type_error(2, "must be of type int, %s given", zend_zval_value_name(z_parse_pos_tmp));
|
||||||
RETURN_THROWS();
|
RETURN_THROWS();
|
||||||
}
|
}
|
||||||
if (ZEND_LONG_INT_OVFL(long_parse_pos)) {
|
if (ZEND_LONG_INT_OVFL(long_parse_pos)) {
|
||||||
|
@ -205,8 +205,7 @@ PHP_METHOD(IntlDateFormatter, parseToCalendar)
|
||||||
}
|
}
|
||||||
internal_parse_to_timestamp( dfo, ZSTR_VAL(text_to_parse), ZSTR_LEN(text_to_parse), z_parse_pos ? &parse_pos : NULL, true, return_value);
|
internal_parse_to_timestamp( dfo, ZSTR_VAL(text_to_parse), ZSTR_LEN(text_to_parse), z_parse_pos ? &parse_pos : NULL, true, return_value);
|
||||||
if (z_parse_pos) {
|
if (z_parse_pos) {
|
||||||
zval_ptr_dtor(z_parse_pos);
|
ZEND_TRY_ASSIGN_REF_LONG(z_parse_pos, parse_pos);
|
||||||
ZVAL_LONG(z_parse_pos, parse_pos);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
26
ext/intl/tests/parseToCalendar_references_type_system.phpt
Normal file
26
ext/intl/tests/parseToCalendar_references_type_system.phpt
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
--TEST--
|
||||||
|
IntlDateFormatter::parseToCalendar() reference type system breaks
|
||||||
|
--EXTENSIONS--
|
||||||
|
intl
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
class Test {
|
||||||
|
public float $prop = 0.0;
|
||||||
|
}
|
||||||
|
$test = new Test;
|
||||||
|
$offset =& $test->prop;
|
||||||
|
|
||||||
|
$oIntlDateFormatter = new IntlDateFormatter("en_GB");
|
||||||
|
$oIntlDateFormatter->setTimeZone('Europe/Berlin');
|
||||||
|
$oIntlDateFormatter->setPattern('VV');
|
||||||
|
var_dump($oIntlDateFormatter->parseToCalendar('America/Los_Angeles', $offset));
|
||||||
|
var_dump($offset);
|
||||||
|
var_dump($test);
|
||||||
|
?>
|
||||||
|
--EXPECTF--
|
||||||
|
int(%d)
|
||||||
|
float(%f)
|
||||||
|
object(Test)#%d (1) {
|
||||||
|
["prop"]=>
|
||||||
|
&float(%f)
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue