Commit: 46a3f257724df7b85cc8c3e6374c36ed9ee783b4 Author: Reeze Xia <reeze....@gmail.com> Sun, 19 Aug 2012 17:57:45 +0800 Parents: 1a23d42909070269d53fc7500d683e88ba219cb3 Branches: PHP-5.3
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=46a3f257724df7b85cc8c3e6374c36ed9ee783b4 Log: Fixed bug #62852 (Unserialize invalid DateTime causes crash) Bugs: https://bugs.php.net/62852 Changed paths: M ext/date/php_date.c A ext/date/tests/bug62852.phpt Diff: diff --git a/ext/date/php_date.c b/ext/date/php_date.c index e8a4570..d9e6a28 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -2544,6 +2544,9 @@ static int php_date_initialize_from_hash(zval **return_value, php_date_obj **dat if (zend_hash_find(myht, "timezone_type", 14, (void**) &z_timezone_type) == SUCCESS) { convert_to_long(*z_timezone_type); if (zend_hash_find(myht, "timezone", 9, (void**) &z_timezone) == SUCCESS) { + zend_error_handling error_handling; + + zend_replace_error_handling(EH_THROW, NULL, &error_handling TSRMLS_CC); convert_to_string(*z_timezone); switch (Z_LVAL_PP(z_timezone_type)) { @@ -2551,9 +2554,9 @@ static int php_date_initialize_from_hash(zval **return_value, php_date_obj **dat case TIMELIB_ZONETYPE_ABBR: { char *tmp = emalloc(Z_STRLEN_PP(z_date) + Z_STRLEN_PP(z_timezone) + 2); snprintf(tmp, Z_STRLEN_PP(z_date) + Z_STRLEN_PP(z_timezone) + 2, "%s %s", Z_STRVAL_PP(z_date), Z_STRVAL_PP(z_timezone)); - php_date_initialize(*dateobj, tmp, Z_STRLEN_PP(z_date) + Z_STRLEN_PP(z_timezone) + 1, NULL, NULL, 0 TSRMLS_CC); + php_date_initialize(*dateobj, tmp, Z_STRLEN_PP(z_date) + Z_STRLEN_PP(z_timezone) + 1, NULL, NULL, 1 TSRMLS_CC); efree(tmp); - return 1; + break; } case TIMELIB_ZONETYPE_ID: @@ -2567,10 +2570,15 @@ static int php_date_initialize_from_hash(zval **return_value, php_date_obj **dat tzobj->tzi.tz = tzi; tzobj->initialized = 1; - php_date_initialize(*dateobj, Z_STRVAL_PP(z_date), Z_STRLEN_PP(z_date), NULL, tmp_obj, 0 TSRMLS_CC); + php_date_initialize(*dateobj, Z_STRVAL_PP(z_date), Z_STRLEN_PP(z_date), NULL, tmp_obj, 1 TSRMLS_CC); zval_ptr_dtor(&tmp_obj); - return 1; + break; + default: + zend_restore_error_handling(&error_handling TSRMLS_CC); + return 0; } + zend_restore_error_handling(&error_handling TSRMLS_CC); + return 1; } } } diff --git a/ext/date/tests/bug62852.phpt b/ext/date/tests/bug62852.phpt new file mode 100644 index 0000000..6426a80 --- /dev/null +++ b/ext/date/tests/bug62852.phpt @@ -0,0 +1,15 @@ +--TEST-- +Bug #62852 (Unserialize invalid DateTime causes crash) +--INI-- +date.timezone=GMT +--FILE-- +<?php +try { + $datetime = unserialize('O:8:"DateTime":3:{s:4:"date";s:20:"10007-06-07 03:51:49";s:13:"timezone_type";i:3;s:8:"timezone";s:3:"UTC";}'); + var_dump($datetime); +} catch (Exception $e) { + var_dump($e->getMessage()); +} +?> +--EXPECTF-- +string(%d) "DateTime::__wakeup(): Failed to parse time string (%s) at position 12 (0): Double time specification" -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php