Skip to content

Commit 2beec54

Browse files
committed
datefmt_parse/datefmt_localtime references type system fixes
Closes GH-18441.
1 parent 2eb3100 commit 2beec54

File tree

3 files changed

+46
-10
lines changed

3 files changed

+46
-10
lines changed

NEWS

+3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ PHP NEWS
77
inaccurate sunrise and sunset times, but other calculated times are
88
correct) (JiriJozif).
99

10+
- Intl:
11+
. datefmt_parse/datefmt_localtime references type system fixes. (nielsdos)
12+
1013
- SPL:
1114
. Fixed bug GH-18421 (Integer overflow with large numbers in LimitIterator).
1215
(nielsdos)

ext/intl/dateformat/dateformat_parse.c

+8-10
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,9 @@ PHP_FUNCTION(datefmt_parse)
136136
DATE_FORMAT_METHOD_FETCH_OBJECT;
137137

138138
if (z_parse_pos) {
139-
zend_long long_parse_pos;
140-
ZVAL_DEREF(z_parse_pos);
141-
long_parse_pos = zval_get_long(z_parse_pos);
139+
zval *z_parse_pos_tmp = z_parse_pos;
140+
ZVAL_DEREF(z_parse_pos_tmp);
141+
zend_long long_parse_pos = zval_get_long(z_parse_pos_tmp);
142142
if (ZEND_LONG_INT_OVFL(long_parse_pos)) {
143143
intl_error_set_code(NULL, U_ILLEGAL_ARGUMENT_ERROR);
144144
intl_error_set_custom_msg(NULL, "String index is out of valid range.", 0);
@@ -151,8 +151,7 @@ PHP_FUNCTION(datefmt_parse)
151151
}
152152
internal_parse_to_timestamp( dfo, text_to_parse, text_len, z_parse_pos?&parse_pos:NULL, return_value);
153153
if(z_parse_pos) {
154-
zval_ptr_dtor(z_parse_pos);
155-
ZVAL_LONG(z_parse_pos, parse_pos);
154+
ZEND_TRY_ASSIGN_REF_LONG(z_parse_pos, parse_pos);
156155
}
157156
}
158157
/* }}} */
@@ -177,9 +176,9 @@ PHP_FUNCTION(datefmt_localtime)
177176
DATE_FORMAT_METHOD_FETCH_OBJECT;
178177

179178
if (z_parse_pos) {
180-
zend_long long_parse_pos;
181-
ZVAL_DEREF(z_parse_pos);
182-
long_parse_pos = zval_get_long(z_parse_pos);
179+
zval *z_parse_pos_tmp = z_parse_pos;
180+
ZVAL_DEREF(z_parse_pos_tmp);
181+
zend_long long_parse_pos = zval_get_long(z_parse_pos_tmp);
183182
if (ZEND_LONG_INT_OVFL(long_parse_pos)) {
184183
intl_error_set_code(NULL, U_ILLEGAL_ARGUMENT_ERROR);
185184
intl_error_set_custom_msg(NULL, "String index is out of valid range.", 0);
@@ -192,8 +191,7 @@ PHP_FUNCTION(datefmt_localtime)
192191
}
193192
internal_parse_to_localtime( dfo, text_to_parse, text_len, z_parse_pos?&parse_pos:NULL, return_value);
194193
if (z_parse_pos) {
195-
zval_ptr_dtor(z_parse_pos);
196-
ZVAL_LONG(z_parse_pos, parse_pos);
194+
ZEND_TRY_ASSIGN_REF_LONG(z_parse_pos, parse_pos);
197195
}
198196
}
199197
/* }}} */
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
--TEST--
2+
datefmt_parse/datefmt_localtime references type system
3+
--EXTENSIONS--
4+
intl
5+
--FILE--
6+
<?php
7+
8+
class Test {
9+
public float $prop = 1.0;
10+
}
11+
12+
$test = new Test;
13+
$offset1 =& $test->prop;
14+
$offset2 =& $test->prop;
15+
16+
$fmt = datefmt_create(
17+
'en_US',
18+
IntlDateFormatter::FULL,
19+
IntlDateFormatter::FULL,
20+
'America/Los_Angeles',
21+
IntlDateFormatter::GREGORIAN
22+
);
23+
datefmt_localtime($fmt, 'Wednesday, December 31, 1969 4:00:00 PM PT', $offset1);
24+
datefmt_parse($fmt, 'Wednesday, December 31, 1969 4:00:00 PM PT', $offset2);
25+
var_dump($offset1, $offset2);
26+
var_dump($test);
27+
28+
?>
29+
--EXPECT--
30+
float(1)
31+
float(1)
32+
object(Test)#1 (1) {
33+
["prop"]=>
34+
&float(1)
35+
}

0 commit comments

Comments
 (0)