]> granicus.if.org Git - php/commitdiff
Fix bug #52808 (Segfault when specifying interval as two dates)
authorStanislav Malyshev <stas@php.net>
Sun, 30 Jan 2011 08:54:53 +0000 (08:54 +0000)
committerStanislav Malyshev <stas@php.net>
Sun, 30 Jan 2011 08:54:53 +0000 (08:54 +0000)
ext/date/php_date.c
ext/date/tests/bug52808.phpt [new file with mode: 0644]

index 82d74f8edc53681143949862a6872fef5b2a4651..15a31572d66ca355e760801c407cbf4e781036dc 100644 (file)
@@ -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 (file)
index 0000000..e031ac6
--- /dev/null
@@ -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==