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

Reply via email to