iliaa Sun Dec 3 17:13:27 2006 UTC Modified files: /php-src/ext/standard assert.c Log: MFB: Fixed bug #39718 (possible crash if assert.callback is set in ini). http://cvs.php.net/viewvc.cgi/php-src/ext/standard/assert.c?r1=1.69&r2=1.70&diff_format=u Index: php-src/ext/standard/assert.c diff -u php-src/ext/standard/assert.c:1.69 php-src/ext/standard/assert.c:1.70 --- php-src/ext/standard/assert.c:1.69 Fri Sep 22 01:55:47 2006 +++ php-src/ext/standard/assert.c Sun Dec 3 17:13:27 2006 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: assert.c,v 1.69 2006/09/22 01:55:47 pollita Exp $ */ +/* $Id: assert.c,v 1.70 2006/12/03 17:13:27 iliaa Exp $ */ /* {{{ includes/startup/misc */ @@ -30,6 +30,7 @@ long warning; long quiet_eval; zval *callback; + char *cb; ZEND_END_MODULE_GLOBALS(assert) ZEND_DECLARE_MODULE_GLOBALS(assert) @@ -52,15 +53,26 @@ static PHP_INI_MH(OnChangeCallback) { - if (ASSERTG(callback)) { - zval_ptr_dtor(&ASSERTG(callback)); - } - - if (new_value && (ASSERTG(callback) || new_value_length)) { - MAKE_STD_ZVAL(ASSERTG(callback)); - ZVAL_STRINGL(ASSERTG(callback), new_value, new_value_length, 1); + if (EG(in_execution)) { + if (ASSERTG(callback)) { + zval_ptr_dtor(&ASSERTG(callback)); + } + if (new_value && (ASSERTG(callback) || new_value_length)) { + MAKE_STD_ZVAL(ASSERTG(callback)); + ZVAL_STRINGL(ASSERTG(callback), new_value, new_value_length, 1); + } + } else { + if (ASSERTG(cb)) { + pefree(ASSERTG(cb), 1); + } + if (new_value && new_value_length) { + ASSERTG(cb) = pemalloc(new_value_length + 1, 1); + memcpy(ASSERTG(cb), new_value, new_value_length); + ASSERTG(cb)[new_value_length] = '\0'; + } else { + ASSERTG(cb) = NULL; + } } - return SUCCESS; } @@ -75,6 +87,7 @@ static void php_assert_init_globals(zend_assert_globals *assert_globals_p TSRMLS_DC) { assert_globals_p->callback = NULL; + assert_globals_p->cb = NULL; } PHP_MINIT_FUNCTION(assert) @@ -94,9 +107,9 @@ PHP_MSHUTDOWN_FUNCTION(assert) { - if (ASSERTG(callback)) { - zval_ptr_dtor(&ASSERTG(callback)); - ASSERTG(callback) = NULL; + if (ASSERTG(cb)) { + pefree(ASSERTG(cb), 1); + ASSERTG(cb) = NULL; } return SUCCESS; } @@ -189,6 +202,11 @@ RETURN_TRUE; } + if (!ASSERTG(callback) && ASSERTG(cb)) { + MAKE_STD_ZVAL(ASSERTG(callback)); + ZVAL_STRING(ASSERTG(callback), ASSERTG(cb), 1); + } + if (ASSERTG(callback)) { zval *args[3]; zval *retval;
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php