File php-5.1.2-zend-fix.patch of Package php

--- Zend/zend_execute_API.c
+++ Zend/zend_execute_API.c
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_execute_API.c,v 1.331.2.11 2006/01/04 23:53:04 andi Exp $ */
+/* $Id: zend_execute_API.c,v 1.331.2.13 2006/01/22 22:14:32 helly Exp $ */
 
 #include <stdio.h>
 #include <signal.h>
@@ -582,6 +582,7 @@
 	zend_op **original_opline_ptr;
 	zend_class_entry *current_scope;
 	zend_class_entry *calling_scope = NULL;
+	zend_class_entry *check_scope_or_static = NULL;
 	zval *current_this;
 	zend_execute_data execute_data;
 	zval *method_name;
@@ -713,16 +714,18 @@
 		if (calling_scope && (colon = strstr(fname, "::")) != NULL) {
 			int clen = colon - fname;
 			int mlen = fname_len - clen - 2;
-			zend_class_entry **pce, *ce_child;
+			zend_class_entry **pce, *ce_child = NULL;
 			if (zend_lookup_class(fname, clen, &pce TSRMLS_CC) == SUCCESS) {
 				ce_child = *pce;
 			} else {
 				char *lcname = zend_str_tolower_dup(fname, clen);
 				/* caution: lcname is not '\0' terminated */
-				if (clen == sizeof("self") - 1 && memcmp(lcname, "self", sizeof("self") - 1) == 0) {
-					ce_child = EG(active_op_array) ? EG(active_op_array)->scope : NULL;
-				} else if (clen == sizeof("parent") - 1 && memcmp(lcname, "parent", sizeof("parent") - 1) == 0 && EG(active_op_array)->scope) {
-					ce_child = EG(active_op_array) && EG(active_op_array)->scope ? EG(scope)->parent : NULL;
+				if (calling_scope) {
+					if (clen == sizeof("self") - 1 && memcmp(lcname, "self", sizeof("self") - 1) == 0) {
+						ce_child = EG(active_op_array) ? EG(active_op_array)->scope : NULL;
+					} else if (clen == sizeof("parent") - 1 && memcmp(lcname, "parent", sizeof("parent") - 1) == 0 && EG(active_op_array)->scope) {
+						ce_child = EG(active_op_array) && EG(active_op_array)->scope ? EG(scope)->parent : NULL;
+					}
 				}
 				efree(lcname);
 			}
@@ -730,10 +733,7 @@
 				zend_error(E_ERROR, "Cannot call method %s() or method does not exist", fname);
 				return FAILURE;
 			}
-			if (!instanceof_function(calling_scope, ce_child TSRMLS_CC)) {
-				zend_error(E_ERROR, "Cannot call method %s() of class %s which is not a derived from %s", fname, ce_child->name, calling_scope->name);
-				return 0;
-			}
+			check_scope_or_static = calling_scope;
 			fci->function_table = &ce_child->function_table;
 			calling_scope = ce_child;
 			fname = fname + clen + 2;
@@ -760,6 +760,12 @@
 			EX(function_state).function = 
 				zend_std_get_static_method(calling_scope, function_name_lc, fname_len TSRMLS_CC);
 			efree(function_name_lc);
+			if (check_scope_or_static && EX(function_state).function
+			&& !(EX(function_state).function->common.fn_flags & ZEND_ACC_STATIC)
+			&& !instanceof_function(check_scope_or_static, calling_scope TSRMLS_CC)) {
+				zend_error(E_ERROR, "Cannot call method %s() of class %s which is not a derived from %s", fname, calling_scope->name, check_scope_or_static->name);
+				return 0;
+			}
 		} else {
 			char *function_name_lc = zend_str_tolower_dup(fname, fname_len);
 
openSUSE Build Service is sponsored by