derick          Thu Jan 17 20:34:17 2008 UTC

  Added files:                 
    /php-src/ext/date/tests     bug43808.phpt 

  Modified files:              
    /php-src/ext/date   php_date.c 
  Log:
  - Fixed bug #43808 (date_create never fails (even when it should)).
  
  
http://cvs.php.net/viewvc.cgi/php-src/ext/date/php_date.c?r1=1.155&r2=1.156&diff_format=u
Index: php-src/ext/date/php_date.c
diff -u php-src/ext/date/php_date.c:1.155 php-src/ext/date/php_date.c:1.156
--- php-src/ext/date/php_date.c:1.155   Thu Jan 17 19:58:24 2008
+++ php-src/ext/date/php_date.c Thu Jan 17 20:34:17 2008
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_date.c,v 1.155 2008/01/17 19:58:24 derick Exp $ */
+/* $Id: php_date.c,v 1.156 2008/01/17 20:34:17 derick Exp $ */
 
 #include "php.h"
 #include "php_streams.h"
@@ -1832,7 +1832,7 @@
        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;
@@ -1856,6 +1856,16 @@
        // 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;
 
@@ -1910,7 +1920,9 @@
        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]])
@@ -1927,7 +1939,9 @@
        }
 
        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;
+       }
 }
 /* }}} */
 
@@ -1945,7 +1959,9 @@
        }
 
        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;
+       }
 }
 /* }}} */
 
@@ -1960,7 +1976,7 @@
        
        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);
 }

http://cvs.php.net/viewvc.cgi/php-src/ext/date/tests/bug43808.phpt?view=markup&rev=1.1
Index: php-src/ext/date/tests/bug43808.phpt
+++ php-src/ext/date/tests/bug43808.phpt
--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"
  }
}
--UEXPECT--
bool(false)
array(4) {
  [u"warning_count"]=>
  int(1)
  [u"warnings"]=>
  array(1) {
    [6]=>
    string(29) "Double timezone specification"
  }
  [u"error_count"]=>
  int(1)
  [u"errors"]=>
  array(1) {
    [0]=>
    string(47) "The timezone could not be found in the database"
  }
}
array(4) {
  [u"warning_count"]=>
  int(1)
  [u"warnings"]=>
  array(1) {
    [6]=>
    string(29) "Double timezone specification"
  }
  [u"error_count"]=>
  int(1)
  [u"errors"]=>
  array(1) {
    [0]=>
    string(47) "The timezone could not be found in the database"
  }
}

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to