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