Fix IntlDateFormatter::parseToCalendar() reference type system breaks

Closes GH-18440.
This commit is contained in:
Niels Dossche 2025-04-27 00:13:11 +02:00
parent d00adca199
commit 173dccb646
No known key found for this signature in database
GPG key ID: B8A8AD166DF0E2E5
3 changed files with 33 additions and 6 deletions

2
NEWS
View file

@ -9,6 +9,8 @@ PHP NEWS
- Intl:
. datefmt_parse/datefmt_localtime references type system fixes. (nielsdos)
. Fix IntlDateFormatter::parseToCalendar() reference type system breaks.
(nielsdos)
- SPL:
. Fixed bug GH-18421 (Integer overflow with large numbers in LimitIterator).

View file

@ -185,12 +185,12 @@ PHP_METHOD(IntlDateFormatter, parseToCalendar)
DATE_FORMAT_METHOD_FETCH_OBJECT;
if (z_parse_pos) {
zend_long long_parse_pos;
ZVAL_DEREF(z_parse_pos);
zval *z_parse_pos_tmp = z_parse_pos;
ZVAL_DEREF(z_parse_pos_tmp);
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) {
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();
}
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);
if (z_parse_pos) {
zval_ptr_dtor(z_parse_pos);
ZVAL_LONG(z_parse_pos, parse_pos);
ZEND_TRY_ASSIGN_REF_LONG(z_parse_pos, parse_pos);
}
}

View 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)
}