Skip to content

Commit 2f1d0f2

Browse files
authored
Throw directly instead of replacing error handler in ext/date (php#6954)
1 parent b9cfd28 commit 2f1d0f2

File tree

8 files changed

+38
-49
lines changed

8 files changed

+38
-49
lines changed

Zend/tests/bug54043.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@ var_dump(error_get_last());
1616

1717
?>
1818
--EXPECT--
19-
string(105) "DateTime::__construct(): Failed to parse time string (9999-11-33) at position 9 (3): Unexpected character"
19+
string(80) "Failed to parse time string (9999-11-33) at position 9 (3): Unexpected character"
2020
NULL

ext/date/php_date.c

Lines changed: 27 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2215,10 +2215,10 @@ PHPAPI int php_date_initialize(php_date_obj *dateobj, const char *time_str, size
22152215
/* update last errors and warnings */
22162216
update_errors_warnings(err);
22172217

2218-
2218+
/* If called from a constructor throw an exception */
22192219
if ((flags & PHP_DATE_INIT_CTOR) && err && err->error_count) {
22202220
/* spit out the first library error message, at least */
2221-
php_error_docref(NULL, E_WARNING, "Failed to parse time string (%s) at position %d (%c): %s", time_str,
2221+
zend_throw_exception_ex(NULL, 0, "Failed to parse time string (%s) at position %d (%c): %s", time_str,
22222222
err->error_messages[0].position, err->error_messages[0].character, err->error_messages[0].message);
22232223
}
22242224
if (err && err->error_count) {
@@ -2386,17 +2386,14 @@ PHP_METHOD(DateTime, __construct)
23862386
zval *timezone_object = NULL;
23872387
char *time_str = NULL;
23882388
size_t time_str_len = 0;
2389-
zend_error_handling error_handling;
23902389

23912390
ZEND_PARSE_PARAMETERS_START(0, 2)
23922391
Z_PARAM_OPTIONAL
23932392
Z_PARAM_STRING(time_str, time_str_len)
23942393
Z_PARAM_OBJECT_OF_CLASS_OR_NULL(timezone_object, date_ce_timezone)
23952394
ZEND_PARSE_PARAMETERS_END();
23962395

2397-
zend_replace_error_handling(EH_THROW, NULL, &error_handling);
23982396
php_date_initialize(Z_PHPDATE_P(ZEND_THIS), time_str, time_str_len, NULL, timezone_object, PHP_DATE_INIT_CTOR);
2399-
zend_restore_error_handling(&error_handling);
24002397
}
24012398
/* }}} */
24022399

@@ -2406,17 +2403,14 @@ PHP_METHOD(DateTimeImmutable, __construct)
24062403
zval *timezone_object = NULL;
24072404
char *time_str = NULL;
24082405
size_t time_str_len = 0;
2409-
zend_error_handling error_handling;
24102406

24112407
ZEND_PARSE_PARAMETERS_START(0, 2)
24122408
Z_PARAM_OPTIONAL
24132409
Z_PARAM_STRING(time_str, time_str_len)
24142410
Z_PARAM_OBJECT_OF_CLASS_OR_NULL(timezone_object, date_ce_timezone)
24152411
ZEND_PARSE_PARAMETERS_END();
24162412

2417-
zend_replace_error_handling(EH_THROW, NULL, &error_handling);
24182413
php_date_initialize(Z_PHPDATE_P(ZEND_THIS), time_str, time_str_len, NULL, timezone_object, PHP_DATE_INIT_CTOR);
2419-
zend_restore_error_handling(&error_handling);
24202414
}
24212415
/* }}} */
24222416

@@ -3686,35 +3680,35 @@ PHP_FUNCTION(timezone_location_get)
36863680
}
36873681
/* }}} */
36883682

3689-
static int date_interval_initialize(timelib_rel_time **rt, /*const*/ char *format, size_t format_length) /* {{{ */
3683+
static bool date_interval_initialize(timelib_rel_time **rt, /*const*/ char *format, size_t format_length) /* {{{ */
36903684
{
36913685
timelib_time *b = NULL, *e = NULL;
36923686
timelib_rel_time *p = NULL;
36933687
int r = 0;
3694-
int retval = 0;
3688+
bool retval = false;
36953689
timelib_error_container *errors;
36963690

36973691
timelib_strtointerval(format, format_length, &b, &e, &p, &r, &errors);
36983692

36993693
if (errors->error_count > 0) {
3700-
php_error_docref(NULL, E_WARNING, "Unknown or bad format (%s)", format);
3701-
retval = FAILURE;
3694+
zend_throw_exception_ex(NULL, 0, "Unknown or bad format (%s)", format);
3695+
retval = false;
37023696
if (p) {
37033697
timelib_rel_time_dtor(p);
37043698
}
37053699
} else {
37063700
if(p) {
37073701
*rt = p;
3708-
retval = SUCCESS;
3702+
retval = true;
37093703
} else {
37103704
if(b && e) {
37113705
timelib_update_ts(b, NULL);
37123706
timelib_update_ts(e, NULL);
37133707
*rt = timelib_diff(b, e);
3714-
retval = SUCCESS;
3708+
retval = true;
37153709
} else {
3716-
php_error_docref(NULL, E_WARNING, "Failed to parse interval (%s)", format);
3717-
retval = FAILURE;
3710+
zend_throw_exception_ex(NULL, 0, "Failed to parse interval (%s)", format);
3711+
retval = false;
37183712
}
37193713
}
37203714
}
@@ -3853,20 +3847,19 @@ PHP_METHOD(DateInterval, __construct)
38533847
{
38543848
zend_string *interval_string = NULL;
38553849
timelib_rel_time *reltime;
3856-
zend_error_handling error_handling;
38573850

38583851
ZEND_PARSE_PARAMETERS_START(1, 1)
38593852
Z_PARAM_STR(interval_string)
38603853
ZEND_PARSE_PARAMETERS_END();
38613854

3862-
zend_replace_error_handling(EH_THROW, NULL, &error_handling);
3863-
if (date_interval_initialize(&reltime, ZSTR_VAL(interval_string), ZSTR_LEN(interval_string)) == SUCCESS) {
3864-
php_interval_obj *diobj = Z_PHPINTERVAL_P(ZEND_THIS);
3865-
diobj->diff = reltime;
3866-
diobj->initialized = 1;
3867-
diobj->civil_or_wall = PHP_DATE_WALL;
3855+
if (!date_interval_initialize(&reltime, ZSTR_VAL(interval_string), ZSTR_LEN(interval_string))) {
3856+
RETURN_THROWS();
38683857
}
3869-
zend_restore_error_handling(&error_handling);
3858+
3859+
php_interval_obj *diobj = Z_PHPINTERVAL_P(ZEND_THIS);
3860+
diobj->diff = reltime;
3861+
diobj->initialized = 1;
3862+
diobj->civil_or_wall = PHP_DATE_WALL;
38703863
}
38713864
/* }}} */
38723865

@@ -4117,19 +4110,19 @@ PHP_FUNCTION(date_interval_format)
41174110
}
41184111
/* }}} */
41194112

4120-
static int date_period_initialize(timelib_time **st, timelib_time **et, timelib_rel_time **d, zend_long *recurrences, /*const*/ char *format, size_t format_length) /* {{{ */
4113+
static bool date_period_initialize(timelib_time **st, timelib_time **et, timelib_rel_time **d, zend_long *recurrences, /*const*/ char *format, size_t format_length) /* {{{ */
41214114
{
41224115
timelib_time *b = NULL, *e = NULL;
41234116
timelib_rel_time *p = NULL;
41244117
int r = 0;
4125-
int retval = 0;
41264118
timelib_error_container *errors;
4119+
bool retval = false;
41274120

41284121
timelib_strtointerval(format, format_length, &b, &e, &p, &r, &errors);
41294122

41304123
if (errors->error_count > 0) {
4131-
php_error_docref(NULL, E_WARNING, "Unknown or bad format (%s)", format);
4132-
retval = FAILURE;
4124+
retval = false;
4125+
zend_throw_exception_ex(NULL, 0, "Unknown or bad format (%s)", format);
41334126
if (b) {
41344127
timelib_time_dtor(b);
41354128
}
@@ -4144,7 +4137,7 @@ static int date_period_initialize(timelib_time **st, timelib_time **et, timelib_
41444137
*et = e;
41454138
*d = p;
41464139
*recurrences = r;
4147-
retval = SUCCESS;
4140+
retval = true;
41484141
}
41494142
timelib_error_container_dtor(errors);
41504143
return retval;
@@ -4160,7 +4153,6 @@ PHP_METHOD(DatePeriod, __construct)
41604153
char *isostr = NULL;
41614154
size_t isostr_len = 0;
41624155
timelib_time *clone;
4163-
zend_error_handling error_handling;
41644156

41654157
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "OOl|l", &start, date_ce_interface, &interval, date_ce_interval, &recurrences, &options) == FAILURE) {
41664158
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "OOO|l", &start, date_ce_interface, &interval, date_ce_interval, &end, date_ce_interface, &options) == FAILURE) {
@@ -4175,28 +4167,25 @@ PHP_METHOD(DatePeriod, __construct)
41754167
dpobj->current = NULL;
41764168

41774169
if (isostr) {
4178-
zend_replace_error_handling(EH_THROW, NULL, &error_handling);
4179-
date_period_initialize(&(dpobj->start), &(dpobj->end), &(dpobj->interval), &recurrences, isostr, isostr_len);
4180-
zend_restore_error_handling(&error_handling);
4181-
if (EG(exception)) {
4170+
if (!date_period_initialize(&(dpobj->start), &(dpobj->end), &(dpobj->interval), &recurrences, isostr, isostr_len)) {
41824171
RETURN_THROWS();
41834172
}
41844173

41854174
if (dpobj->start == NULL) {
41864175
zend_string *func = get_active_function_or_method_name();
4187-
zend_throw_error(zend_ce_exception, "%s(): ISO interval must contain a start date, \"%s\" given", ZSTR_VAL(func), isostr);
4176+
zend_throw_exception_ex(NULL, 0, "%s(): ISO interval must contain a start date, \"%s\" given", ZSTR_VAL(func), isostr);
41884177
zend_string_release(func);
41894178
RETURN_THROWS();
41904179
}
41914180
if (dpobj->interval == NULL) {
41924181
zend_string *func = get_active_function_or_method_name();
4193-
zend_throw_error(zend_ce_exception, "%s(): ISO interval must contain an interval, \"%s\" given", ZSTR_VAL(func), isostr);
4182+
zend_throw_exception_ex(NULL, 0, "%s(): ISO interval must contain an interval, \"%s\" given", ZSTR_VAL(func), isostr);
41944183
zend_string_release(func);
41954184
RETURN_THROWS();
41964185
}
41974186
if (dpobj->end == NULL && recurrences == 0) {
41984187
zend_string *func = get_active_function_or_method_name();
4199-
zend_throw_error(zend_ce_exception, "%s(): ISO interval must contain an end date or a recurrence count, \"%s\" given", ZSTR_VAL(func), isostr);
4188+
zend_throw_exception_ex(NULL, 0, "%s(): ISO interval must contain an end date or a recurrence count, \"%s\" given", ZSTR_VAL(func), isostr);
42004189
zend_string_release(func);
42014190
RETURN_THROWS();
42024191
}
@@ -4238,7 +4227,7 @@ PHP_METHOD(DatePeriod, __construct)
42384227

42394228
if (dpobj->end == NULL && recurrences < 1) {
42404229
zend_string *func = get_active_function_or_method_name();
4241-
zend_throw_error(zend_ce_exception, "%s(): Recurrence count must be greater than 0", ZSTR_VAL(func));
4230+
zend_throw_exception_ex(NULL, 0, "%s(): Recurrence count must be greater than 0", ZSTR_VAL(func));
42424231
zend_string_release(func);
42434232
RETURN_THROWS();
42444233
}

ext/date/tests/bug44562.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ foreach ( $dp as $d )
2121

2222
?>
2323
--EXPECT--
24-
DatePeriod::__construct(): Unknown or bad format (2D)
24+
Unknown or bad format (2D)
2525
string(24) "2008-07-20T22:44:53+0200"
2626
string(24) "2008-07-21T22:44:53+0200"
2727
string(24) "2008-07-22T22:44:53+0200"

ext/date/tests/bug52808.phpt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ object(DateInterval)#%d (16) {
127127
["have_special_relative"]=>
128128
int(0)
129129
}
130-
DateInterval::__construct(): Failed to parse interval (2007-05-11T15:30:00Z/)
131-
DateInterval::__construct(): Failed to parse interval (2007-05-11T15:30:00Z)
132-
DateInterval::__construct(): Unknown or bad format (2007-05-11T15:30:00Z/:00Z)
130+
Failed to parse interval (2007-05-11T15:30:00Z/)
131+
Failed to parse interval (2007-05-11T15:30:00Z)
132+
Unknown or bad format (2007-05-11T15:30:00Z/:00Z)
133133
==DONE==

ext/date/tests/bug54283.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ try {
1212
?>
1313
--EXPECTF--
1414
Deprecated: DatePeriod::__construct(): Passing null to parameter #1 ($start) of type string is deprecated in %s on line %d
15-
string(51) "DatePeriod::__construct(): Unknown or bad format ()"
15+
string(24) "Unknown or bad format ()"

ext/date/tests/bug62500.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,4 @@ int(3)
2626

2727
Warning: Undefined property: Crasher::$2 in %s on line %d
2828
NULL
29-
string(%s) "DateInterval::__construct(): Unknown or bad format (blah)"
29+
string(28) "Unknown or bad format (blah)"

ext/date/tests/date_interval_bad_format_leak.phpt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,6 @@ try {
2323

2424
?>
2525
--EXPECT--
26-
DateInterval::__construct(): Unknown or bad format (P3"D)
27-
DatePeriod::__construct(): Unknown or bad format (P3"D)
28-
DatePeriod::__construct(): Unknown or bad format (2008-03-01T12:00:00Z1)
26+
Unknown or bad format (P3"D)
27+
Unknown or bad format (P3"D)
28+
Unknown or bad format (2008-03-01T12:00:00Z1)

ext/date/tests/oo_001.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ echo "DONE\n";
6565
--EXPECTF--
6666
string(19) "%d-%d-%d %d:%d:%d"
6767
The DateTime object has not been correctly initialized by its constructor
68-
DateTime::__construct(): Failed to parse time string (1am todax) at position 4 (t): The timezone could not be found in the database
68+
Failed to parse time string (1am todax) at position 4 (t): The timezone could not be found in the database
6969
string(3) "UTC"
7070
The DateTimeZone object has not been correctly initialized by its constructor
7171
DateTimeZone::__construct(): Unknown or bad timezone (GottaFindThisOne)

0 commit comments

Comments
 (0)