Skip to content

Commit 173dccb

Browse files
committed
Fix IntlDateFormatter::parseToCalendar() reference type system breaks
Closes GH-18440.
1 parent d00adca commit 173dccb

File tree

3 files changed

+33
-6
lines changed

3 files changed

+33
-6
lines changed

NEWS

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ PHP NEWS
99

1010
- Intl:
1111
. datefmt_parse/datefmt_localtime references type system fixes. (nielsdos)
12+
. Fix IntlDateFormatter::parseToCalendar() reference type system breaks.
13+
(nielsdos)
1214

1315
- SPL:
1416
. Fixed bug GH-18421 (Integer overflow with large numbers in LimitIterator).

ext/intl/dateformat/dateformat_parse.c

+5-6
Original file line numberDiff line numberDiff line change
@@ -185,12 +185,12 @@ PHP_METHOD(IntlDateFormatter, parseToCalendar)
185185
DATE_FORMAT_METHOD_FETCH_OBJECT;
186186

187187
if (z_parse_pos) {
188-
zend_long long_parse_pos;
189-
ZVAL_DEREF(z_parse_pos);
188+
zval *z_parse_pos_tmp = z_parse_pos;
189+
ZVAL_DEREF(z_parse_pos_tmp);
190190
bool failed = false;
191-
long_parse_pos = zval_try_get_long(z_parse_pos, &failed);
191+
zend_long long_parse_pos = zval_try_get_long(z_parse_pos_tmp, &failed);
192192
if (failed) {
193-
zend_argument_type_error(2, "must be of type int, %s given", zend_zval_value_name(z_parse_pos));
193+
zend_argument_type_error(2, "must be of type int, %s given", zend_zval_value_name(z_parse_pos_tmp));
194194
RETURN_THROWS();
195195
}
196196
if (ZEND_LONG_INT_OVFL(long_parse_pos)) {
@@ -205,8 +205,7 @@ PHP_METHOD(IntlDateFormatter, parseToCalendar)
205205
}
206206
internal_parse_to_timestamp( dfo, ZSTR_VAL(text_to_parse), ZSTR_LEN(text_to_parse), z_parse_pos ? &parse_pos : NULL, true, return_value);
207207
if (z_parse_pos) {
208-
zval_ptr_dtor(z_parse_pos);
209-
ZVAL_LONG(z_parse_pos, parse_pos);
208+
ZEND_TRY_ASSIGN_REF_LONG(z_parse_pos, parse_pos);
210209
}
211210
}
212211

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
IntlDateFormatter::parseToCalendar() reference type system breaks
3+
--EXTENSIONS--
4+
intl
5+
--FILE--
6+
<?php
7+
class Test {
8+
public float $prop = 0.0;
9+
}
10+
$test = new Test;
11+
$offset =& $test->prop;
12+
13+
$oIntlDateFormatter = new IntlDateFormatter("en_GB");
14+
$oIntlDateFormatter->setTimeZone('Europe/Berlin');
15+
$oIntlDateFormatter->setPattern('VV');
16+
var_dump($oIntlDateFormatter->parseToCalendar('America/Los_Angeles', $offset));
17+
var_dump($offset);
18+
var_dump($test);
19+
?>
20+
--EXPECTF--
21+
int(%d)
22+
float(%f)
23+
object(Test)#%d (1) {
24+
["prop"]=>
25+
&float(%f)
26+
}

0 commit comments

Comments
 (0)