iliaa                                    Wed, 30 Dec 2009 19:15:11 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=292823

Log:
Fixed bug #44827 (define() allows :: in constant names).

Bug: http://bugs.php.net/44827 (Assigned) define('::') can be defined
      
Changed paths:
    U   php/php-src/branches/PHP_5_2/NEWS
    U   php/php-src/branches/PHP_5_2/Zend/zend_builtin_functions.c
    U   php/php-src/branches/PHP_5_3/NEWS
    U   php/php-src/branches/PHP_5_3/Zend/zend_builtin_functions.c
    U   php/php-src/trunk/Zend/zend_builtin_functions.c

Modified: php/php-src/branches/PHP_5_2/NEWS
===================================================================
--- php/php-src/branches/PHP_5_2/NEWS   2009-12-30 18:41:45 UTC (rev 292822)
+++ php/php-src/branches/PHP_5_2/NEWS   2009-12-30 19:15:11 UTC (rev 292823)
@@ -28,6 +28,7 @@
   then 1024 fields). (Ilia, sjoerd-php at linuxonly dot nl)
 - Fixed bug #45599 (strip_tags() truncates rest of string with invalid
   attribute). (Ilia, hradtke)
+- Fixed bug #44827 (define() allows :: in constant names). (Ilia)


 17 Dec 2009, PHP 5.2.12

Modified: php/php-src/branches/PHP_5_2/Zend/zend_builtin_functions.c
===================================================================
--- php/php-src/branches/PHP_5_2/Zend/zend_builtin_functions.c  2009-12-30 
18:41:45 UTC (rev 292822)
+++ php/php-src/branches/PHP_5_2/Zend/zend_builtin_functions.c  2009-12-30 
19:15:11 UTC (rev 292823)
@@ -461,7 +461,6 @@
        zend_bool non_cs = 0;
        int case_sensitive = CONST_CS;
        zend_constant c;
-       char *p;

        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz|b", &name, 
&name_len, &val, &non_cs) == FAILURE) {
                return;
@@ -472,31 +471,9 @@
        }

        /* class constant, check if there is name and make sure class is valid 
& exists */
-       if ((p = zend_memnstr(name, "::", sizeof("::") - 1, name + name_len))) {
-               char *class_name;
-               int found;
-               zend_class_entry **ce;
-               ALLOCA_FLAG(use_heap)
-
-               if (p == (name + name_len - sizeof("::") + 1)) {
-                       zend_error(E_WARNING, "Class constant must have a 
name");
-                       RETURN_FALSE;
-               } else if (p == name) {
-                       zend_error(E_WARNING, "Missing class name");
-                       RETURN_FALSE;
-               }
-
-               class_name = do_alloca_with_limit((p - name + 1), use_heap);
-               zend_str_tolower_copy(class_name, name, (p - name));
-
-               found = zend_hash_find(EG(class_table), class_name, p - name + 
1, (void **) &ce);
-
-               if (found != SUCCESS) {
-                       zend_error(E_WARNING, "Class '%s' does not exist", 
class_name);
-                       free_alloca_with_limit(class_name, use_heap);
-                       RETURN_FALSE;
-               }
-               free_alloca_with_limit(class_name, use_heap);
+       if (zend_memnstr(name, "::", sizeof("::") - 1, name + name_len)) {
+               zend_error(E_WARNING, "Class constants cannot be defined or 
redefined");
+               RETURN_FALSE;
        }

 repeat:

Modified: php/php-src/branches/PHP_5_3/NEWS
===================================================================
--- php/php-src/branches/PHP_5_3/NEWS   2009-12-30 18:41:45 UTC (rev 292822)
+++ php/php-src/branches/PHP_5_3/NEWS   2009-12-30 19:15:11 UTC (rev 292823)
@@ -11,6 +11,7 @@
   in HTTP uploads). (Ilia)
 - Fixed bug #47409 (extract() problem with array containing word "this").
   (Ilia, chrisstocktonaz at gmail dot com)
+- Fixed bug #44827 (define() allows :: in constant names). (Ilia)


 ?? ??? 20??, PHP 5.3.2

Modified: php/php-src/branches/PHP_5_3/Zend/zend_builtin_functions.c
===================================================================
--- php/php-src/branches/PHP_5_3/Zend/zend_builtin_functions.c  2009-12-30 
18:41:45 UTC (rev 292822)
+++ php/php-src/branches/PHP_5_3/Zend/zend_builtin_functions.c  2009-12-30 
19:15:11 UTC (rev 292823)
@@ -629,7 +629,6 @@
        zend_bool non_cs = 0;
        int case_sensitive = CONST_CS;
        zend_constant c;
-       char *p;

        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz|b", &name, 
&name_len, &val, &non_cs) == FAILURE) {
                return;
@@ -640,31 +639,9 @@
        }

        /* class constant, check if there is name and make sure class is valid 
& exists */
-       if ((p = zend_memnstr(name, "::", sizeof("::") - 1, name + name_len))) {
-               char *class_name;
-               int found;
-               zend_class_entry **ce;
-               ALLOCA_FLAG(use_heap)
-
-               if (p == (name + name_len - sizeof("::") + 1)) {
-                       zend_error(E_WARNING, "Class constant must have a 
name");
-                       RETURN_FALSE;
-               } else if (p == name) {
-                       zend_error(E_WARNING, "Missing class name");
-                       RETURN_FALSE;
-               }
-
-               class_name = do_alloca((p - name + 1), use_heap);
-               zend_str_tolower_copy(class_name, name, (p - name));
-
-               found = zend_hash_find(EG(class_table), class_name, p - name + 
1, (void **) &ce);
-
-               if (found != SUCCESS) {
-                       zend_error(E_WARNING, "Class '%s' does not exist", 
class_name);
-                       free_alloca(class_name, use_heap);
-                       RETURN_FALSE;
-               }
-               free_alloca(class_name, use_heap);
+       if (zend_memnstr(name, "::", sizeof("::") - 1, name + name_len)) {
+               zend_error(E_WARNING, "Class constants cannot be defined or 
redefined");
+               RETURN_FALSE;
        }

 repeat:

Modified: php/php-src/trunk/Zend/zend_builtin_functions.c
===================================================================
--- php/php-src/trunk/Zend/zend_builtin_functions.c     2009-12-30 18:41:45 UTC 
(rev 292822)
+++ php/php-src/trunk/Zend/zend_builtin_functions.c     2009-12-30 19:15:11 UTC 
(rev 292823)
@@ -623,12 +623,25 @@
        zend_bool non_cs = 0;
        int case_sensitive = CONST_CS;
        zend_constant c;
+       void *found = NULL;

        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "tz|b", &name, 
&name_len, &name_type, &val, &non_cs) == FAILURE) {
                return;
        }

-       if(non_cs) {
+       if (name_type == IS_UNICODE) {
+               UChar *sep = USTR_MAKE("::");
+               found = zend_u_memnstr(name.u, sep, sizeof("::") - 1, name.u + 
name_len);
+               efree(sep);
+       } else {
+               found = zend_memnstr(name.s, "::", sizeof("::") - 1, name.s + 
name_len);
+       }
+       if (found) {
+               zend_error(E_WARNING, "Class constants cannot be defined or 
redefined");
+               RETURN_FALSE;
+       }
+
+       if (non_cs) {
                case_sensitive = 0;
        }


-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to