From 5bb0a44e06a51737c6be17acd172168fbd9fc80d Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 30 Jan 2011 08:54:53 +0000 Subject: [PATCH] Fix bug #52808 (Segfault when specifying interval as two dates) --- ext/date/php_date.c | 16 ++++++- ext/date/tests/bug52808.phpt | 85 ++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 ext/date/tests/bug52808.phpt diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 82d74f8edc..15a31572d6 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -3456,8 +3456,20 @@ static int date_interval_initialize(timelib_rel_time **rt, /*const*/ char *forma php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown or bad format (%s)", format); retval = FAILURE; } else { - *rt = p; - retval = SUCCESS; + if(p) { + *rt = p; + retval = SUCCESS; + } else { + if(b && e) { + timelib_update_ts(b, NULL); + timelib_update_ts(e, NULL); + *rt = timelib_diff(b, e); + retval = SUCCESS; + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to parse interval (%s)", format); + retval = FAILURE; + } + } } timelib_error_container_dtor(errors); return retval; diff --git a/ext/date/tests/bug52808.phpt b/ext/date/tests/bug52808.phpt new file mode 100644 index 0000000000..e031ac6ee3 --- /dev/null +++ b/ext/date/tests/bug52808.phpt @@ -0,0 +1,85 @@ +--TEST-- +Bug #52808 (Segfault when specifying interval as two dates) +--FILE-- +getMessage(), "\n"; + } +} +echo "==DONE==\n"; +?> +--EXPECTF-- +object(DateInterval)#%d (8) { + ["y"]=> + int(1) + ["m"]=> + int(2) + ["d"]=> + int(10) + ["h"]=> + int(2) + ["i"]=> + int(30) + ["s"]=> + int(0) + ["invert"]=> + int(1) + ["days"]=> + int(437) +} +object(DateInterval)#%d (8) { + ["y"]=> + int(0) + ["m"]=> + int(9) + ["d"]=> + int(18) + ["h"]=> + int(21) + ["i"]=> + int(30) + ["s"]=> + int(0) + ["invert"]=> + int(0) + ["days"]=> + int(294) +} +object(DateInterval)#%d (8) { + ["y"]=> + int(0) + ["m"]=> + int(9) + ["d"]=> + int(18) + ["h"]=> + int(21) + ["i"]=> + int(30) + ["s"]=> + int(0) + ["invert"]=> + int(0) + ["days"]=> + int(294) +} +DateInterval::__construct(): Failed to parse interval (2007-05-11T15:30:00Z/) +DateInterval::__construct(): Failed to parse interval (2007-05-11T15:30:00Z) +DateInterval::__construct(): Unknown or bad format (2007-05-11T15:30:00Z/:00Z) +==DONE== -- 2.40.0