summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanislav Malyshev <stas@php.net>2011-01-30 08:54:53 +0000
committerStanislav Malyshev <stas@php.net>2011-01-30 08:54:53 +0000
commit5bb0a44e06a51737c6be17acd172168fbd9fc80d (patch)
tree594806d6b63f160a12d47c1854120e3aebdc12df
parent147382033aec3ce8863e30524e8d175864047ed8 (diff)
downloadphp-git-5bb0a44e06a51737c6be17acd172168fbd9fc80d.tar.gz
Fix bug #52808 (Segfault when specifying interval as two dates)
-rw-r--r--ext/date/php_date.c16
-rw-r--r--ext/date/tests/bug52808.phpt85
2 files changed, 99 insertions, 2 deletions
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--
+<?php
+date_default_timezone_set('Europe/Oslo');
+$intervals = array(
+ "2008-05-11T15:30:00Z/2007-03-01T13:00:00Z",
+ "2007-05-11T15:30:00Z/2008-03-01T13:00:00Z",
+ "2007-05-11T15:30:00Z 2008-03-01T13:00:00Z",
+ "2007-05-11T15:30:00Z/",
+ "2007-05-11T15:30:00Z",
+ "2007-05-11T15:30:00Z/:00Z",
+);
+foreach($intervals as $iv) {
+ try
+ {
+ $di = new DateInterval($iv);
+ var_dump($di);
+ }
+ catch ( Exception $e )
+ {
+ echo $e->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==