Skip to content

Commit e9ed392

Browse files
committed
update previous trans if current is lower or eq than begin
1 parent 771f930 commit e9ed392

File tree

2 files changed

+67
-14
lines changed

2 files changed

+67
-14
lines changed

ext/date/php_date.c

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4276,13 +4276,13 @@ PHP_FUNCTION(timezone_transitions_get)
42764276
RETURN_FALSE;
42774277
}
42784278

4279-
#define add_nominal() \
4279+
#define add_by_index(i,ts) \
42804280
array_init_size(&element, 5); \
4281-
add_assoc_long(&element, "ts", timestamp_begin); \
4282-
add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601_LARGE_YEAR, 13, timestamp_begin, 0)); \
4283-
add_assoc_long(&element, "offset", tzobj->tzi.tz->type[0].offset); \
4284-
add_assoc_bool(&element, "isdst", tzobj->tzi.tz->type[0].isdst); \
4285-
add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[0].abbr_idx]); \
4281+
add_assoc_long(&element, "ts", ts); \
4282+
add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601_LARGE_YEAR, 13, ts, 0)); \
4283+
add_assoc_long(&element, "offset", tzobj->tzi.tz->type[i].offset); \
4284+
add_assoc_bool(&element, "isdst", tzobj->tzi.tz->type[i].isdst); \
4285+
add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[i].abbr_idx]); \
42864286
add_next_index_zval(return_value, &element);
42874287

42884288
#define add(i,ts) \
@@ -4294,14 +4294,13 @@ PHP_FUNCTION(timezone_transitions_get)
42944294
add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].abbr_idx]); \
42954295
add_next_index_zval(return_value, &element);
42964296

4297-
#define add_by_index(i,ts) \
4298-
array_init_size(&element, 5); \
4297+
#define upd_prev(i,ts) \
4298+
element = *ZEND_HASH_ELEMENT(Z_ARRVAL_P(return_value), Z_ARRVAL_P(return_value)->nNumUsed-1); \
42994299
add_assoc_long(&element, "ts", ts); \
43004300
add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601_LARGE_YEAR, 13, ts, 0)); \
4301-
add_assoc_long(&element, "offset", tzobj->tzi.tz->type[i].offset); \
4302-
add_assoc_bool(&element, "isdst", tzobj->tzi.tz->type[i].isdst); \
4303-
add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[i].abbr_idx]); \
4304-
add_next_index_zval(return_value, &element);
4301+
add_assoc_long(&element, "offset", tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].offset); \
4302+
add_assoc_bool(&element, "isdst", tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].isdst); \
4303+
add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].abbr_idx]);
43054304

43064305
#define add_from_tto(to,ts) \
43074306
array_init_size(&element, 5); \
@@ -4312,6 +4311,7 @@ PHP_FUNCTION(timezone_transitions_get)
43124311
add_assoc_string(&element, "abbr", (to)->abbr); \
43134312
add_next_index_zval(return_value, &element);
43144313

4314+
#define add_nominal() add_by_index(0, timestamp_begin)
43154315
#define add_last() add(tzobj->tzi.tz->bit64.timecnt - 1, timestamp_begin)
43164316

43174317
array_init(return_value);
@@ -4364,10 +4364,11 @@ PHP_FUNCTION(timezone_transitions_get)
43644364

43654365
if (tzobj->tzi.tz->trans[i] > timestamp_begin) {
43664366
add(i, tzobj->tzi.tz->trans[i]);
4367+
last_transition_ts = tzobj->tzi.tz->trans[i];
4368+
} else {
4369+
upd_prev(i, timestamp_begin);
43674370
}
43684371
}
4369-
4370-
last_transition_ts = tzobj->tzi.tz->trans[tzobj->tzi.tz->bit64.timecnt - 1];
43714372
}
43724373

43734374
if (tzobj->tzi.tz->posix_info && tzobj->tzi.tz->posix_info->dst_end) {

ext/date/tests/gh18051-32bit.phpt

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
--TEST--
2+
Bug GH-18051 (Interger overflow on 32bit)
3+
--SKIPIF--
4+
<?php if (PHP_INT_SIZE != 4) die("skip 32-bit only");
5+
--FILE--
6+
<?php
7+
8+
$tz = new DateTimeZone('America/New_York');
9+
var_dump(array_slice($tz->getTransitions(), 0, 3));
10+
11+
--EXPECT--
12+
array(3) {
13+
[0]=>
14+
array(5) {
15+
["ts"]=>
16+
int(-2147483648)
17+
["time"]=>
18+
string(25) "1901-12-13T20:45:52+00:00"
19+
["offset"]=>
20+
int(-18000)
21+
["isdst"]=>
22+
bool(false)
23+
["abbr"]=>
24+
string(3) "EST"
25+
}
26+
[1]=>
27+
array(5) {
28+
["ts"]=>
29+
int(-1633280400)
30+
["time"]=>
31+
string(25) "1918-03-31T07:00:00+00:00"
32+
["offset"]=>
33+
int(-14400)
34+
["isdst"]=>
35+
bool(true)
36+
["abbr"]=>
37+
string(3) "EDT"
38+
}
39+
[2]=>
40+
array(5) {
41+
["ts"]=>
42+
int(-1615140000)
43+
["time"]=>
44+
string(25) "1918-10-27T06:00:00+00:00"
45+
["offset"]=>
46+
int(-18000)
47+
["isdst"]=>
48+
bool(false)
49+
["abbr"]=>
50+
string(3) "EST"
51+
}
52+
}

0 commit comments

Comments
 (0)