]> granicus.if.org Git - php/commitdiff
- Fixed bug #53305 (E_NOTICE when defining a constant starts with __COMPILER_HALT_OF...
authorFelipe Pena <felipe@php.net>
Sat, 13 Nov 2010 18:46:11 +0000 (18:46 +0000)
committerFelipe Pena <felipe@php.net>
Sat, 13 Nov 2010 18:46:11 +0000 (18:46 +0000)
- Fixed a part of bug #53260 (the __COMPILER_HALT_OFFSET__ name is not shown in the E_NOTICE)

NEWS
Zend/tests/bug53305.phpt [new file with mode: 0644]
Zend/zend_constants.c

diff --git a/NEWS b/NEWS
index 200a7bcb9c4e9826a44b4424acc70b8bed0a6727..6d1b92b586d8a6c2e642344aaf2f4150713efa0b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -62,6 +62,8 @@
 - Fixed the filter extension accepting IPv4 octets with a leading 0 as that
   belongs to the unsupported "dotted octal" representation. (Gustavo)
 
+- Fixed bug #53305 (E_NOTICE when defining a constant starts with
+  __COMPILER_HALT_OFFSET__). (Felipe)
 - Fixed bug #53297 (gettimeofday implementation in php/win32/time.c can return
   1 million microsecs). (ped at 7gods dot org)
 - Fixed bug #53279 (SplFileObject doesn't initialise default CSV escape
diff --git a/Zend/tests/bug53305.phpt b/Zend/tests/bug53305.phpt
new file mode 100644 (file)
index 0000000..c922ac6
--- /dev/null
@@ -0,0 +1,19 @@
+--TEST--
+Bug #53305 (E_NOTICE when defining a constant starts with __COMPILER_HALT_OFFSET__)
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+define('__COMPILER_HALT_OFFSET__1', 1);
+define('__COMPILER_HALT_OFFSET__2', 2);
+define('__COMPILER_HALT_OFFSET__', 3);
+define('__COMPILER_HALT_OFFSET__1'.chr(0), 4);
+
+var_dump(__COMPILER_HALT_OFFSET__1);
+var_dump(constant('__COMPILER_HALT_OFFSET__1'.chr(0)));
+
+?>
+--EXPECTF--
+Notice: Constant __COMPILER_HALT_OFFSET__ already defined in %s on line %d
+int(1)
+int(4)
index 0543903e840b501c00e8ef41f5346ca7721b2b0f..bae13eaf02c598c3bf340ab3c5901282caf63894 100644 (file)
@@ -434,8 +434,15 @@ ZEND_API int zend_register_constant(zend_constant *c TSRMLS_DC)
                }
        }
 
-       if ((strncmp(name, "__COMPILER_HALT_OFFSET__", sizeof("__COMPILER_HALT_OFFSET__") - 1) == 0) ||
-                       zend_hash_add(EG(zend_constants), name, c->name_len, (void *) c, sizeof(zend_constant), NULL)==FAILURE) {
+       /* Check if the user is trying to define the internal pseudo constant name __COMPILER_HALT_OFFSET__ */
+       if ((c->name_len == sizeof("__COMPILER_HALT_OFFSET__")
+               && !memcmp(name, "__COMPILER_HALT_OFFSET__", sizeof("__COMPILER_HALT_OFFSET__")-1))
+               || zend_hash_add(EG(zend_constants), name, c->name_len, (void *) c, sizeof(zend_constant), NULL)==FAILURE) {
+               
+               /* The internal __COMPILER_HALT_OFFSET__ is prefixed by NULL byte */
+               if (strncmp(name+1, "__COMPILER_HALT_OFFSET__", sizeof("__COMPILER_HALT_OFFSET__")) == 0) {
+                       name++;
+               }
                zend_error(E_NOTICE,"Constant %s already defined", name);
                free(c->name);
                if (!(c->flags & CONST_PERSISTENT)) {