summaryrefslogtreecommitdiff
path: root/ext/standard/assert.c
diff options
context:
space:
mode:
authorIlia Alshanetsky <iliaa@php.net>2006-12-03 17:13:11 +0000
committerIlia Alshanetsky <iliaa@php.net>2006-12-03 17:13:11 +0000
commit7999c9d251f64460fee869898d6ad873fb2bd337 (patch)
tree949e48a405a985b54973c175ef04f0d87b438d6c /ext/standard/assert.c
parentb71ac5063eed684b5619ce763ec5bf1c02544f1f (diff)
downloadphp-git-7999c9d251f64460fee869898d6ad873fb2bd337.tar.gz
Fixed bug #39718 (possible crash if assert.callback is set in ini).
Diffstat (limited to 'ext/standard/assert.c')
-rw-r--r--ext/standard/assert.c40
1 files changed, 29 insertions, 11 deletions
diff --git a/ext/standard/assert.c b/ext/standard/assert.c
index b123f09b1a..f2cc77cb79 100644
--- a/ext/standard/assert.c
+++ b/ext/standard/assert.c
@@ -30,6 +30,7 @@ ZEND_BEGIN_MODULE_GLOBALS(assert)
long warning;
long quiet_eval;
zval *callback;
+ char *cb;
ZEND_END_MODULE_GLOBALS(assert)
ZEND_DECLARE_MODULE_GLOBALS(assert)
@@ -52,15 +53,26 @@ enum {
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 @@ PHP_INI_END()
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_MINIT_FUNCTION(assert)
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;
}
@@ -174,6 +187,11 @@ PHP_FUNCTION(assert)
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;