On October 2, 2001 01:55 am, Derick Rethans wrote:
> On Tue, 2 Oct 2001, Zak Greant wrote:
> > Bug report 13505 got me thinking about the behavior of define() -
> > if you try to define a constant name that is a reserved word, or an
> > existing function or class name, no warning is generated.
> >
> > This could have  been a conscious decision - a case where it was
> > decided that some safety could be traded for a bit of extra speed.
> > If it wasn't, then here is a patch to check that the constant name
> > does not clash with a reserved work, function name or class name.
> >
> > I used an array of reserved words and a for loop to handle finding
> > conflicting reserved words. Is there a better way to do this.
> > AFAICT the other methods for handling reserved word conflicts are
> > handled at the parser level. i.e. Trying to define 'function and
> > (){}' generates a parser error.
> >
> > Anyhoo, perhaps someone could take a look at the patch? :)
>
> The idea looks ok, but the looping through the reserved words array
> would be very slow. However, keeping the first two checks in place it
> would be good IMO.

Hi Derick,

Thanks for taking a look! :) Attached is the fixed patch.

Perhaps tying the keyword checking to a certain error level would do 
the trick? Say perhaps if E_NOTICE is enabled, then do the checks? 

Also is there a faster way to do the search? My knowledge of C is still 
rather rudimentary. :o)

-- 
Zak Greant

PHP Quality Assurance Team
http://qa.php.net/

"We must be the change we wish to see." - M. K. Ghandi
Index: zend_builtin_functions.c
===================================================================
RCS file: /repository/Zend/zend_builtin_functions.c,v
retrieving revision 1.103
diff -u -r1.103 zend_builtin_functions.c
--- zend_builtin_functions.c	2001/08/11 15:57:07	1.103
+++ zend_builtin_functions.c	2001/10/02 07:54:43
@@ -380,7 +380,22 @@
 ZEND_FUNCTION(define)
 {
 	zval **var, **val, **non_cs;
-	int case_sensitive;
+	char *lcname;
+	char *reserved_words[] = {
+		"and",          "isset",        "break",        "case",
+		"class",        "continue",     "default",      "die",
+		"do",           "echo",         "else",         "elseif",
+		"empty",        "endfor",       "endforeach",   "endif",
+		"endswitch",    "endwhile",     "exit",         "extends",
+		"for",          "foreach",      "function",     "global",
+		"if",           "include",      "include_once", "list",
+		"new",          "not",          "or",           "parent",
+		"print",        "require",      "require_once", "return",
+		"static",       "stdClass",     "switch",       "var",
+		"virtual",      "while",        "xor",          "__sleep",
+		"__wakeup",     "__file__",		"__line__",		""
+	};
+	int case_sensitive, index;
 	zend_constant c;

 	switch(ZEND_NUM_ARGS()) {
@@ -420,8 +435,38 @@
 			break;
 	}
 	convert_to_string_ex(var);
+
+
+	/* Ensure that the constant will not conflict with existing function or class names */
+    lcname = estrndup((*var)->value.str.val, (*var)->value.str.len);
+    zend_str_tolower(lcname, (*var)->value.str.len);
+
+    if (zend_hash_exists(EG(function_table), lcname, (*var)->value.str.len+1)) {
+        efree(lcname);
+        zend_error(E_WARNING,"Constant names must not conflict with function names");
+        RETURN_FALSE;
+    }
+
+    if (zend_hash_exists(EG(class_table), lcname, (*var)->value.str.len+1)) {
+        efree(lcname);
+        zend_error(E_WARNING,"Constant names must not conflict with class names");
+        RETURN_FALSE;
+    }
+
+    for (index = 0; *reserved_words[index]; ++index) {
+        if (strcmp (reserved_words[index], lcname) == 0) {
+            efree(lcname);
+            zend_error(E_WARNING, "Constant names must not conflict with reserved words");
+            RETURN_FALSE;
+        }
+    }
+
+
+    efree(lcname);

+
 	c.value = **val;
+
 	zval_copy_ctor(&c.value);
 	c.flags = case_sensitive; /* non persistent */
 	c.name = zend_strndup((*var)->value.str.val, (*var)->value.str.len);
-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to