]> granicus.if.org Git - php/commitdiff
MFZE1
authorAndrei Zmievski <andrei@php.net>
Mon, 16 Sep 2002 01:36:48 +0000 (01:36 +0000)
committerAndrei Zmievski <andrei@php.net>
Mon, 16 Sep 2002 01:36:48 +0000 (01:36 +0000)
Zend/zend_API.c
Zend/zend_API.h
Zend/zend_builtin_functions.c
Zend/zend_execute_API.c

index 10f8f3477dfb4a6d97e13eb35c377a140a9fc4a2..030ca9489f87933f82ba543feaa5fe920bb85f9f 100644 (file)
@@ -1290,7 +1290,7 @@ ZEND_API int zend_set_hash_symbol(zval *symbol, char *name, int name_length,
 
 /* Disabled functions support */
 
-static ZEND_FUNCTION(display_disabled_function)
+ZEND_API ZEND_FUNCTION(display_disabled_function)
 {
        zend_error(E_WARNING, "%s() has been disabled for security reasons", get_active_function_name(TSRMLS_C));
 }
index a90cca6139f31bbd3a7a01cf55baf48381b115f3..09ca6e7aabb43e241a53edf7133a56d9951aaf27 100644 (file)
@@ -246,6 +246,8 @@ ZEND_API int zend_set_hash_symbol(zval *symbol, char *name, int name_length,
 
 #define add_method(arg, key, method)   add_assoc_function((arg), (key), (method))
 
+ZEND_API ZEND_FUNCTION(display_disabled_function);
+
 #if ZEND_DEBUG
 #define CHECK_ZVAL_STRING(z) \
        if ((z)->value.str.val[ (z)->value.str.len ] != '\0') zend_error(E_WARNING, "String is not zero-terminated (%s)", (z)->value.str.val);
index 22afc71625bfa4140fa84d3662fde4a9a822f5f6..fdc9c49f9ba834cc46ca7c513ecf96e214b486bc 100644 (file)
@@ -803,8 +803,9 @@ ZEND_FUNCTION(class_exists)
 ZEND_FUNCTION(function_exists)
 {
        zval **function_name;
+       zend_function *func;
        char *lcname;
-       int retval;
+       zend_bool retval;
        
        if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &function_name)==FAILURE) {
                ZEND_WRONG_PARAM_COUNT();
@@ -813,9 +814,18 @@ ZEND_FUNCTION(function_exists)
        lcname = estrndup((*function_name)->value.str.val, (*function_name)->value.str.len);
        zend_str_tolower(lcname, (*function_name)->value.str.len);
 
-       retval = zend_hash_exists(EG(function_table), lcname, (*function_name)->value.str.len+1);
+       retval = (zend_hash_find(EG(function_table), lcname, (*function_name)->value.str.len+1, (void **)&func) == SUCCESS);
        efree(lcname);
 
+       /*
+        * A bit of a hack, but not a bad one: we see if the handler of the function
+        * is actually one that displays "function is disabled" message.
+        */
+       if (retval &&
+               func->internal_function.handler == zif_display_disabled_function) {
+               retval = 0;
+       }
+
        RETURN_BOOL(retval);
 }
 /* }}} */
index b606d416d88c91141bfd36f5da11e2e3dcf4b5d4..5b452d6e3fab1eed74dbeb8bda54f279ae230abc 100644 (file)
@@ -217,13 +217,16 @@ void shutdown_executor(TSRMLS_D)
                }
        } zend_end_try();
 
-       /* The regular list must be destroyed after the main symbol table and
-        * op arrays are destroyed.
+       zend_try {
+               clean_non_persistent_constants(TSRMLS_C);
+       } zend_end_try();
+
+       /* The regular list must be destroyed after the main symbol table,
+        * op arrays, and constants are destroyed.
         */
        zend_destroy_rsrc_list(&EG(regular_list) TSRMLS_CC);
 
        zend_try {
-               clean_non_persistent_constants(TSRMLS_C);
 #if ZEND_DEBUG
        signal(SIGSEGV, original_sigsegv_handler);
 #endif