]> granicus.if.org Git - php/commitdiff
Fixed bug #42820 (defined() on constant with namespace prefixes tries to load class).
authorDmitry Stogov <dmitry@php.net>
Wed, 3 Oct 2007 10:33:45 +0000 (10:33 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 3 Oct 2007 10:33:45 +0000 (10:33 +0000)
Zend/tests/bug42820.phpt [new file with mode: 0755]
Zend/zend_builtin_functions.c
Zend/zend_compile.h
Zend/zend_constants.c
Zend/zend_execute_API.c

diff --git a/Zend/tests/bug42820.phpt b/Zend/tests/bug42820.phpt
new file mode 100755 (executable)
index 0000000..0a6c7d7
--- /dev/null
@@ -0,0 +1,31 @@
+--TEST--
+Bug #42820 (defined() on constant with namespace prefixes tries to load class)
+--FILE--
+<?php
+namespace ns;
+const ok = 0;
+class foo {
+       const ok = 0;
+}
+var_dump(defined('ns::ok'));
+var_dump(defined('ns::bug'));
+var_dump(defined('::ns::ok'));
+var_dump(defined('::ns::bug'));
+var_dump(defined('ns::foo::ok'));
+var_dump(defined('ns::foo::bug'));
+var_dump(defined('::ns::foo::ok'));
+var_dump(defined('::ns::foo::bug'));
+var_dump(defined('ns::bar::bug'));
+var_dump(defined('::ns::bar::bug'));
+--EXPECT--
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+bool(false)
+
index 5fb7554f66a38e1346ed3b405af09ddc09588386..51cbc34f38ed26253c7a7f3f5245d3dedd346b82 100644 (file)
@@ -577,7 +577,7 @@ ZEND_FUNCTION(defined)
        }
 
        convert_to_text_ex(var);
-       if (zend_u_get_constant_ex(Z_TYPE_PP(var), Z_UNIVAL_PP(var), Z_UNILEN_PP(var), &c, NULL, 0 TSRMLS_CC)) {
+       if (zend_u_get_constant_ex(Z_TYPE_PP(var), Z_UNIVAL_PP(var), Z_UNILEN_PP(var), &c, NULL, ZEND_FETCH_CLASS_SILENT TSRMLS_CC)) {
                zval_dtor(&c);
                RETURN_TRUE;
        } else {
index 6ae2bc5bcb4356d9cb1acc222d7c488ff0d58b95..8b86cd3e50dbb0c3204c57157f40bc142b6c6f2a 100644 (file)
@@ -632,11 +632,12 @@ int zendlex(znode *zendlval TSRMLS_DC);
 #define ZEND_FETCH_CLASS_AUTO          5
 #define ZEND_FETCH_CLASS_INTERFACE     6
 #define ZEND_FETCH_CLASS_STATIC                7
-#define ZEND_FETCH_CLASS_FLAGS        0xF0
+#define ZEND_FETCH_CLASS_MASK         0x0f
 #define ZEND_FETCH_CLASS_NO_NORMALIZE 0x10
 #define ZEND_FETCH_CLASS_RT_NS_CHECK  0x20
 #define ZEND_FETCH_CLASS_RT_NS_NAME   0x40
 #define ZEND_FETCH_CLASS_NO_AUTOLOAD  0x80
+#define ZEND_FETCH_CLASS_SILENT       0x0100
 
 /* variable parsing type (compile-time) */
 #define ZEND_PARSED_MEMBER                             (1<<0)
index 14bdf6a94a00e0cdb240df55d28d3a52a7dddcdf..728bbf237f543a3bfb2706e79fc45acee3319c4c 100644 (file)
@@ -321,13 +321,13 @@ ZEND_API int zend_u_get_constant_ex(zend_uchar type, zstr name, uint name_len, z
            name.u[1] == ':') {
                name.u += 2;
                name_len -= 2;
-               flags = 0;
+               flags &= ZEND_FETCH_CLASS_SILENT;
        } else if (type == IS_STRING &&
                   name.s[0] == ':' &&
                   name.s[1] == ':') {
                name.s += 2;
                name_len -= 2;
-               flags = 0;
+               flags &= ZEND_FETCH_CLASS_SILENT;
        }
 
        if ((UG(unicode) && (colon.u = u_memrchr(name.u, ':', name_len)) && colon.u > name.u && *(colon.u-1) == ':') ||
@@ -453,7 +453,9 @@ ZEND_API int zend_u_get_constant_ex(zend_uchar type, zstr name, uint name_len, z
                                        retval = 1;
                                        return zend_u_get_constant(type, name, name_len, result TSRMLS_CC);
                                }
-                               zend_error(E_ERROR, "Class '%R' not found", type, class_name);
+                               if ((flags & ZEND_FETCH_CLASS_SILENT) == 0) {
+                                       zend_error(E_ERROR, "Class '%R' not found", type, class_name);
+                               }
                        }
                        retval = 0;
                }
index 55a7351ab0557a7695e826fbd45af3785a043be0..baf0839f3a8f25628f7f4ab3d7fb9896b1ffda19 100644 (file)
@@ -1700,9 +1700,10 @@ ZEND_API zend_class_entry *zend_u_fetch_class(zend_uchar type, zstr class_name,
        int use_autoload = (fetch_type & ZEND_FETCH_CLASS_NO_AUTOLOAD)  ? 0 : 1;
        int do_normalize = (fetch_type & ZEND_FETCH_CLASS_NO_NORMALIZE) ? 0 : 1;
        int rt_ns_check  = (fetch_type & ZEND_FETCH_CLASS_RT_NS_CHECK)  ? 1 : 0;
+       int silent       = (fetch_type & ZEND_FETCH_CLASS_SILENT) != 0;
        zstr lcname = class_name;
 
-       fetch_type = fetch_type & ~ZEND_FETCH_CLASS_FLAGS;
+       fetch_type &= ZEND_FETCH_CLASS_MASK;
 
 check_fetch_type:
        switch (fetch_type) {
@@ -1780,10 +1781,12 @@ check_fetch_type:
                                }
                                return *pce;
                        }
-                       if (fetch_type == ZEND_FETCH_CLASS_INTERFACE) {
-                               zend_error(E_ERROR, "Interface '%R' not found", type, class_name);
-                       } else {
-                               zend_error(E_ERROR, "Class '%R' not found", type, class_name);
+                       if (!silent) {
+                               if (fetch_type == ZEND_FETCH_CLASS_INTERFACE) {
+                                       zend_error(E_ERROR, "Interface '%R' not found", type, class_name);
+                               } else {
+                                       zend_error(E_ERROR, "Class '%R' not found", type, class_name);
+                               }
                        }
                }
                if (lcname.v != class_name.v) {