Skip to content

Commit 7831976

Browse files
committed
Merge branch 'PHP-8.2'
2 parents 973e9b2 + 1b53605 commit 7831976

File tree

3 files changed

+47
-14
lines changed

3 files changed

+47
-14
lines changed

ext/date/lib/timelib.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ typedef struct _timelib_tzdb {
379379
#define TIMELIB_OVERRIDE_TIME 0x01
380380
#define TIMELIB_NO_CLONE 0x02
381381

382-
#define TIMELIB_UNSET -99999
382+
#define TIMELIB_UNSET -9999999
383383

384384
/* An entry for each of these error codes is also in the
385385
* timelib_error_messages array in timelib.c.

ext/date/php_date.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2206,7 +2206,7 @@ static void date_interval_object_to_hash(php_interval_obj *intervalobj, HashTabl
22062206
ZVAL_DOUBLE(&zv, (double)intervalobj->diff->us / 1000000.0);
22072207
zend_hash_str_update(props, "f", sizeof("f") - 1, &zv);
22082208
PHP_DATE_INTERVAL_ADD_PROPERTY("invert", invert);
2209-
if (intervalobj->diff->days != -99999) {
2209+
if (intervalobj->diff->days != TIMELIB_UNSET) {
22102210
PHP_DATE_INTERVAL_ADD_PROPERTY("days", days);
22112211
} else {
22122212
ZVAL_FALSE(&zv);
@@ -2997,7 +2997,7 @@ static void php_date_do_return_parsed_time(INTERNAL_FUNCTION_PARAMETERS, timelib
29972997

29982998
array_init(return_value);
29992999
#define PHP_DATE_PARSE_DATE_SET_TIME_ELEMENT(name, elem) \
3000-
if (parsed_time->elem == -99999) { \
3000+
if (parsed_time->elem == TIMELIB_UNSET) { \
30013001
add_assoc_bool(return_value, #name, 0); \
30023002
} else { \
30033003
add_assoc_long(return_value, #name, parsed_time->elem); \
@@ -3009,7 +3009,7 @@ static void php_date_do_return_parsed_time(INTERNAL_FUNCTION_PARAMETERS, timelib
30093009
PHP_DATE_PARSE_DATE_SET_TIME_ELEMENT(minute, i);
30103010
PHP_DATE_PARSE_DATE_SET_TIME_ELEMENT(second, s);
30113011

3012-
if (parsed_time->us == -99999) {
3012+
if (parsed_time->us == TIMELIB_UNSET) {
30133013
add_assoc_bool(return_value, "fraction", 0);
30143014
} else {
30153015
add_assoc_double(return_value, "fraction", (double)parsed_time->us / 1000000.0);
@@ -3147,21 +3147,21 @@ static bool php_date_modify(zval *object, char *modify, size_t modify_len) /* {{
31473147
dateobj->time->have_relative = tmp_time->have_relative;
31483148
dateobj->time->sse_uptodate = 0;
31493149

3150-
if (tmp_time->y != -99999) {
3150+
if (tmp_time->y != TIMELIB_UNSET) {
31513151
dateobj->time->y = tmp_time->y;
31523152
}
3153-
if (tmp_time->m != -99999) {
3153+
if (tmp_time->m != TIMELIB_UNSET) {
31543154
dateobj->time->m = tmp_time->m;
31553155
}
3156-
if (tmp_time->d != -99999) {
3156+
if (tmp_time->d != TIMELIB_UNSET) {
31573157
dateobj->time->d = tmp_time->d;
31583158
}
31593159

3160-
if (tmp_time->h != -99999) {
3160+
if (tmp_time->h != TIMELIB_UNSET) {
31613161
dateobj->time->h = tmp_time->h;
3162-
if (tmp_time->i != -99999) {
3162+
if (tmp_time->i != TIMELIB_UNSET) {
31633163
dateobj->time->i = tmp_time->i;
3164-
if (tmp_time->s != -99999) {
3164+
if (tmp_time->s != TIMELIB_UNSET) {
31653165
dateobj->time->s = tmp_time->s;
31663166
} else {
31673167
dateobj->time->s = 0;
@@ -3172,7 +3172,7 @@ static bool php_date_modify(zval *object, char *modify, size_t modify_len) /* {{
31723172
}
31733173
}
31743174

3175-
if (tmp_time->us != -99999) {
3175+
if (tmp_time->us != TIMELIB_UNSET) {
31763176
dateobj->time->us = tmp_time->us;
31773177
}
31783178

@@ -4322,7 +4322,7 @@ static zval *date_interval_read_property(zend_object *object, zend_string *name,
43224322

43234323
if (fvalue != -1) {
43244324
ZVAL_DOUBLE(retval, fvalue);
4325-
} else if (value != -99999) {
4325+
} else if (value != TIMELIB_UNSET) {
43264326
ZVAL_LONG(retval, value);
43274327
} else {
43284328
ZVAL_FALSE(retval);
@@ -4480,7 +4480,7 @@ static void php_date_interval_initialize_from_hash(zval **return_value, php_inte
44804480
do { \
44814481
zval *z_arg = zend_hash_str_find(myht, "days", sizeof("days") - 1); \
44824482
if (z_arg && Z_TYPE_P(z_arg) == IS_FALSE) { \
4483-
(*intobj)->diff->member = -99999; \
4483+
(*intobj)->diff->member = TIMELIB_UNSET; \
44844484
} else if (z_arg && Z_TYPE_P(z_arg) <= IS_STRING) { \
44854485
zend_string *str = zval_get_string(z_arg); \
44864486
DATE_A64I((*intobj)->diff->member, ZSTR_VAL(str)); \
@@ -4759,7 +4759,7 @@ static zend_string *date_interval_format(char *format, size_t format_len, timeli
47594759
case 'f': length = slprintf(buffer, sizeof(buffer), ZEND_LONG_FMT, (zend_long) t->us); break;
47604760

47614761
case 'a': {
4762-
if ((int) t->days != -99999) {
4762+
if ((int) t->days != TIMELIB_UNSET) {
47634763
length = slprintf(buffer, sizeof(buffer), "%d", (int) t->days);
47644764
} else {
47654765
length = slprintf(buffer, sizeof(buffer), "(unknown)");

ext/date/tests/bug-gh11368.phpt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
--TEST--
2+
Bug GH-11368: Date modify returns invalid datetime
3+
--INI--
4+
date.timezone=UTC
5+
--FILE--
6+
<?php
7+
8+
$datetime = date_create('2023-06-04');
9+
10+
$datetime->setTime(1,1,1,1 /* If set to any other number, it works fine */);
11+
var_dump($datetime);
12+
13+
$datetime->modify('-100 ms');
14+
var_dump($datetime);
15+
16+
?>
17+
--EXPECTF--
18+
object(DateTime)#1 (3) {
19+
["date"]=>
20+
string(26) "2023-06-04 01:01:01.000001"
21+
["timezone_type"]=>
22+
int(3)
23+
["timezone"]=>
24+
string(3) "UTC"
25+
}
26+
object(DateTime)#1 (3) {
27+
["date"]=>
28+
string(26) "2023-06-04 01:01:00.900001"
29+
["timezone_type"]=>
30+
int(3)
31+
["timezone"]=>
32+
string(3) "UTC"
33+
}

0 commit comments

Comments
 (0)