]> granicus.if.org Git - php/commitdiff
- MFH: Fixed bug #43808 (date_create never fails (even when it should)).
authorDerick Rethans <derick@php.net>
Thu, 17 Jan 2008 20:35:02 +0000 (20:35 +0000)
committerDerick Rethans <derick@php.net>
Thu, 17 Jan 2008 20:35:02 +0000 (20:35 +0000)
NEWS
ext/date/php_date.c
ext/date/tests/bug43808.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 9e96c19b84b7978b646d92eed299f17002173c3b..405cada2ec4cbc57e26a94bc13d47b405f93d8db 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -77,6 +77,7 @@ PHP                                                                        NEWS
 
 - Fixed possible crash in ext/soap because of uninitialized value. (Zdash Urf)
 
+- Fixed bug #43808 (date_create never fails (even when it should)). (Derick)
 - Fixed bug #43527 (DateTime created from a timestamp reports environment
   timezone). (Derick)
 - Fixed bug #43003 (Invalid timezone reported for DateTime objects constructed
index fe0fae275fb3277a9fb5bcb49124ec05500ae663..598ee7948702b58494b9814468cd76851db6c5cb 100644 (file)
@@ -1702,7 +1702,7 @@ static void update_errors_warnings(timelib_error_container *last_errors TSRMLS_D
        DATEG(last_errors) = last_errors;
 }
 
-static void date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, int time_str_len, char *format, zval *timezone_object TSRMLS_DC)
+static int date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, int time_str_len, char *format, zval *timezone_object, int ctor TSRMLS_DC)
 {
        timelib_time   *now;
        timelib_tzinfo *tzi;
@@ -1726,6 +1726,16 @@ static void date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, int
        // update last errors and warnings
        update_errors_warnings(err TSRMLS_CC);
 
+
+       if (ctor && err && err->error_count) {
+               /* spit out the first library error message, at least */
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to parse time string (%s) at position %d (%c): %s", time_str,
+                       err->error_messages[0].position, err->error_messages[0].character, err->error_messages[0].message);
+       }
+       if (err && err->error_count) {
+               return 0;
+       }
+
        if (timezone_object) {
                php_timezone_obj *tzobj;
 
@@ -1780,7 +1790,9 @@ static void date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, int
        if (free_tzi) {
                timelib_tzinfo_dtor(tzi);
        }
-       timelib_time_dtor(now); 
+       timelib_time_dtor(now);
+
+       return 1;
 }
 
 /* {{{ proto DateTime date_create([string time[, DateTimeZone object]])
@@ -1797,7 +1809,9 @@ PHP_FUNCTION(date_create)
        }
 
        date_instantiate(date_ce_date, return_value TSRMLS_CC);
-       date_initialize(zend_object_store_get_object(return_value TSRMLS_CC), time_str, time_str_len, NULL, timezone_object TSRMLS_CC);
+       if (!date_initialize(zend_object_store_get_object(return_value TSRMLS_CC), time_str, time_str_len, NULL, timezone_object, 0 TSRMLS_CC)) {
+               RETURN_FALSE;
+       }
 }
 /* }}} */
 
@@ -1815,7 +1829,9 @@ PHP_FUNCTION(date_create_from_format)
        }
 
        date_instantiate(date_ce_date, return_value TSRMLS_CC);
-       date_initialize(zend_object_store_get_object(return_value TSRMLS_CC), time_str, time_str_len, format_str, timezone_object TSRMLS_CC);
+       if (!date_initialize(zend_object_store_get_object(return_value TSRMLS_CC), time_str, time_str_len, format_str, timezone_object, 0 TSRMLS_CC)) {
+               RETURN_FALSE;
+       }
 }
 /* }}} */
 
@@ -1830,7 +1846,7 @@ PHP_METHOD(DateTime, __construct)
        
        php_set_error_handling(EH_THROW, NULL TSRMLS_CC);
        if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sO", &time_str, &time_str_len, &timezone_object, date_ce_timezone)) {
-               date_initialize(zend_object_store_get_object(getThis() TSRMLS_CC), time_str, time_str_len, NULL, timezone_object TSRMLS_CC);
+               date_initialize(zend_object_store_get_object(getThis() TSRMLS_CC), time_str, time_str_len, NULL, timezone_object, 1 TSRMLS_CC);
        }
        php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
 }
diff --git a/ext/date/tests/bug43808.phpt b/ext/date/tests/bug43808.phpt
new file mode 100644 (file)
index 0000000..74b2317
--- /dev/null
@@ -0,0 +1,48 @@
+--TEST--
+Bug #43808 (date_create never fails (even when it should))
+--FILE--
+<?php
+$date = date_create('asdfasdf');
+
+if ($date instanceof DateTime) {
+       echo "this is wrong, should be bool";
+}
+
+var_dump( $date );
+var_dump( DateTime::getLastErrors() );
+var_dump( date_get_last_errors() );
+?>
+--EXPECT--
+bool(false)
+array(4) {
+  ["warning_count"]=>
+  int(1)
+  ["warnings"]=>
+  array(1) {
+    [6]=>
+    string(29) "Double timezone specification"
+  }
+  ["error_count"]=>
+  int(1)
+  ["errors"]=>
+  array(1) {
+    [0]=>
+    string(47) "The timezone could not be found in the database"
+  }
+}
+array(4) {
+  ["warning_count"]=>
+  int(1)
+  ["warnings"]=>
+  array(1) {
+    [6]=>
+    string(29) "Double timezone specification"
+  }
+  ["error_count"]=>
+  int(1)
+  ["errors"]=>
+  array(1) {
+    [0]=>
+    string(47) "The timezone could not be found in the database"
+  }
+}