cvs: ZendEngine2(PHP_5_3) / zend_constants.c /tests bug46304.phpt

[email protected] ("Stanislav Malyshev") Mon, 12 Jan 2009 21:54:37 -0000
Newsgroups php.zend-engine.cvs
Message-ID <cvsstas1231797277@cvsserver>
stas		Mon Jan 12 21:54:37 2009 UTC

  Added files:                 (Branch: PHP_5_3)
    /ZendEngine2/tests	bug46304.phpt 

  Modified files:              
    /ZendEngine2	zend_constants.c 
  Log:
  fix #46304: Defining namespaced constant using define() uses case sensitive match for namespace 
  
  
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_constants.c?r1=1.71.2.5.2.7.2.16&r2=1.71.2.5.2.7.2.17&diff_format=u
Index: ZendEngine2/zend_constants.c
diff -u ZendEngine2/zend_constants.c:1.71.2.5.2.7.2.16 ZendEngine2/zend_constants.c:1.71.2.5.2.7.2.17
--- ZendEngine2/zend_constants.c:1.71.2.5.2.7.2.16	Wed Dec 31 11:15:32 2008
+++ ZendEngine2/zend_constants.c	Mon Jan 12 21:54:37 2009
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_constants.c,v 1.71.2.5.2.7.2.16 2008/12/31 11:15:32 sebastian Exp $ */
+/* $Id: zend_constants.c,v 1.71.2.5.2.7.2.17 2009/01/12 21:54:37 stas Exp $ */
 
 #include "zend.h"
 #include "zend_constants.h"
@@ -357,6 +357,7 @@
 		int const_name_len = name_len - prefix_len - 1;
 		char *constant_name = colon + 1;
 		char *lcname;
+		int found_const = 0;
 
 		lcname = zend_str_tolower_dup(name, prefix_len);
 		/* Check for namespace constant */
@@ -367,7 +368,18 @@
 		memcpy(lcname + prefix_len + 1, constant_name, const_name_len + 1);
 
 		if (zend_hash_find(EG(zend_constants), lcname, prefix_len + 1 + const_name_len + 1, (void **) &c) == SUCCESS) {
-			efree(lcname);
+			found_const = 1;
+		} else {
+			/* try lowercase */
+			zend_str_tolower(lcname + prefix_len + 1, const_name_len);
+			if (zend_hash_find(EG(zend_constants), lcname, prefix_len + 1 + const_name_len + 1, (void **) &c) == SUCCESS) {
+				if ((c->flags & CONST_CS) == 0) {
+					found_const = 1;
+				}
+			}
+		}
+		efree(lcname);
+		if(found_const) {
 			*result = c->value;
 			zval_update_constant_ex(&result, (void*)1, NULL TSRMLS_CC);
 			zval_copy_ctor(result);
@@ -375,8 +387,6 @@
 			Z_UNSET_ISREF_P(result);
 			return 1;
 		}
-
-		efree(lcname);
 		/* name requires runtime resolution, need to check non-namespaced name */
 		if ((flags & IS_CONSTANT_UNQUALIFIED) != 0) {
 			name = constant_name;
@@ -414,7 +424,14 @@
 		zend_str_tolower(lowercase_name, c->name_len-1);
 		name = lowercase_name;
 	} else {
-		name = c->name;
+		char *slash = strrchr(c->name, '\\');
+		if(slash) {
+			lowercase_name = estrndup(c->name, c->name_len-1);
+			zend_str_tolower(lowercase_name, slash-c->name);
+			name = lowercase_name;
+		} else {
+			name = c->name;
+		}
 	}
 
 	if ((strncmp(name, "__COMPILER_HALT_OFFSET__", sizeof("__COMPILER_HALT_OFFSET__") - 1) == 0) ||

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug46304.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/bug46304.phpt
+++ ZendEngine2/tests/bug46304.phpt