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]