]> granicus.if.org Git - php/commitdiff
Fixed bug #62744 (dangling pointers made by zend_disable_class)
authorXinchen Hui <laruence@php.net>
Sat, 4 Aug 2012 02:41:26 +0000 (10:41 +0800)
committerXinchen Hui <laruence@php.net>
Sat, 4 Aug 2012 02:41:26 +0000 (10:41 +0800)
the test will be added while commit the fix for #62737

NEWS
Zend/zend_API.c
Zend/zend_API.h

diff --git a/NEWS b/NEWS
index 05a80eb6e7029a9fb2d884b842ed2746780ff32c..c22d7c2fd429f3265563571502ff55338fd25049 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,7 @@ PHP                                                                        NEWS
 ?? ??? 2012, PHP 5.3.16
 
 - Core:
+  . Fixed bug #62744 (dangling pointers made by zend_disable_class). (Laruence)
   . Fixed bug #62716 (munmap() is called with the incorrect length). 
     (slangley@google.com)
   . Fixed bug #60194 (--with-zend-multibyte and --enable-debug reports LEAK
index 6d2ccd2c69fcfbaa8ff2a3825c53e41456e59afb..16a940dcac3663477eee567168148e2f998a8beb 100644 (file)
@@ -2342,16 +2342,16 @@ static const zend_function_entry disabled_class_new[] = {
 
 ZEND_API int zend_disable_class(char *class_name, uint class_name_length TSRMLS_DC) /* {{{ */
 {
-       zend_class_entry disabled_class;
+       zend_class_entry **disabled_class;
 
        zend_str_tolower(class_name, class_name_length);
-       if (zend_hash_del(CG(class_table), class_name, class_name_length+1)==FAILURE) {
+       if (zend_hash_find(CG(class_table), class_name, class_name_length+1, (void **)&disabled_class)==FAILURE) {
                return FAILURE;
        }
-       INIT_OVERLOADED_CLASS_ENTRY_EX(disabled_class, class_name, class_name_length, disabled_class_new, NULL, NULL, NULL, NULL, NULL);
-       disabled_class.create_object = display_disabled_class;
-       disabled_class.name_length = class_name_length;
-       zend_register_internal_class(&disabled_class TSRMLS_CC);
+       INIT_CLASS_ENTRY_INIT_METHODS((**disabled_class), disabled_class_new, NULL, NULL, NULL, NULL, NULL);
+       (*disabled_class)->create_object = display_disabled_class;
+       (*disabled_class)->builtin_functions = disabled_class_new;
+       zend_hash_clean(&((*disabled_class)->function_table));
        return SUCCESS;
 }
 /* }}} */
@@ -2425,7 +2425,6 @@ static int zend_is_callable_check_class(const char *name, int name_len, zend_fca
 }
 /* }}} */
 
-
 static int zend_is_callable_check_func(int check_flags, zval *callable, zend_fcall_info_cache *fcc, int strict_class, char **error TSRMLS_DC) /* {{{ */
 {
        zend_class_entry *ce_org = fcc->calling_scope;
index 0a2a5955572ffb7b027bc0371f518dfe7f228945..ddd84fa584777986881664b9cfcbb5746d6e1b09 100644 (file)
@@ -170,6 +170,11 @@ typedef struct _zend_fcall_info_cache {
                int _len = class_name_len;                                                              \
                class_container.name = zend_strndup(class_name, _len);  \
                class_container.name_length = _len;                                             \
+               INIT_CLASS_ENTRY_INIT_METHODS(class_container, functions, handle_fcall, handle_propget, handle_propset, handle_propunset, handle_propisset) \
+       }
+
+#define INIT_CLASS_ENTRY_INIT_METHODS(class_container, functions, handle_fcall, handle_propget, handle_propset, handle_propunset, handle_propisset) \
+       {                                                                                                                       \
                class_container.builtin_functions = functions;                  \
                class_container.constructor = NULL;                                             \
                class_container.destructor = NULL;                                              \