]> granicus.if.org Git - php/commitdiff
fix leak appearing when calling non-static protected or private methods as static
authorAntony Dovgal <tony2001@php.net>
Sat, 2 Feb 2008 22:29:26 +0000 (22:29 +0000)
committerAntony Dovgal <tony2001@php.net>
Sat, 2 Feb 2008 22:29:26 +0000 (22:29 +0000)
(error message is allocated twice)

Zend/zend_API.c

index 5291c7eb5e262e7bfd98e78a3d599803c139394e..cd2605916c82a1b37636a989e9016e5432eb6209 100644 (file)
@@ -2652,6 +2652,10 @@ static int zend_is_callable_check_func(int check_flags, zval ***zobj_ptr_ptr, ze
        zend_function *fptr;
        HashTable *ftable;
 
+       if (error) {
+               *error = NULL;
+       }
+
        *ce_ptr = NULL;
        *fptr_ptr = NULL;
 
@@ -2792,12 +2796,22 @@ static int zend_is_callable_check_func(int check_flags, zval ***zobj_ptr_ptr, ze
                        if (retval && (check_flags & IS_CALLABLE_CHECK_NO_ACCESS) == 0) {
                                if (fptr->op_array.fn_flags & ZEND_ACC_PRIVATE) {
                                        if (!zend_check_private(fptr, *zobj_ptr_ptr ? Z_OBJCE_PP(*zobj_ptr_ptr) : EG(scope), lmname, mlen TSRMLS_CC)) {
-                                               if (error) zend_spprintf(error, 0, "cannot access private method %s::%s()", (*ce_ptr)->name, fptr->common.function_name);
+                                               if (error) {
+                                                       if (*error) {
+                                                               efree(*error);
+                                                       }
+                                                       zend_spprintf(error, 0, "cannot access private method %s::%s()", (*ce_ptr)->name, fptr->common.function_name);
+                                               }
                                                retval = 0;
                                        }
                                } else if ((fptr->common.fn_flags & ZEND_ACC_PROTECTED)) {
                                        if (!zend_check_protected(fptr->common.scope, EG(scope))) {
-                                               if (error) zend_spprintf(error, 0, "cannot access protected method %s::%s()", (*ce_ptr)->name, fptr->common.function_name);
+                                               if (error) {
+                                                       if (*error) {
+                                                               efree(*error);
+                                                       }
+                                                       zend_spprintf(error, 0, "cannot access protected method %s::%s()", (*ce_ptr)->name, fptr->common.function_name);
+                                               }
                                                retval = 0;
                                        }
                                }