cvs: ZendEngine2(PHP_5_3) / zend_builtin_functions.c
[email protected] ("Ilia Alshanetsky")
| Newsgroups | php.zend-engine.cvs |
|---|---|
| Message-ID | <cvsiliaa1224439657@cvsserver> |
iliaa Sun Oct 19 18:07:37 2008 UTC
Modified files: (Branch: PHP_5_3)
/ZendEngine2 zend_builtin_functions.c
Log:
Fixed bug #46341 (Added missing validation checks into define() for class
constants)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_builtin_functions.c?r1=1.277.2.12.2.25.2.29&r2=1.277.2.12.2.25.2.30&diff_format=u
Index: ZendEngine2/zend_builtin_functions.c
diff -u ZendEngine2/zend_builtin_functions.c:1.277.2.12.2.25.2.29 ZendEngine2/zend_builtin_functions.c:1.277.2.12.2.25.2.30
--- ZendEngine2/zend_builtin_functions.c:1.277.2.12.2.25.2.29 Fri Aug 22 00:59:39 2008
+++ ZendEngine2/zend_builtin_functions.c Sun Oct 19 18:07:37 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_builtin_functions.c,v 1.277.2.12.2.25.2.29 2008/08/22 00:59:39 felipe Exp $ */
+/* $Id: zend_builtin_functions.c,v 1.277.2.12.2.25.2.30 2008/10/19 18:07:37 iliaa Exp $ */
#include "zend.h"
#include "zend_API.h"
@@ -26,6 +26,7 @@
#include "zend_ini.h"
#include "zend_exceptions.h"
#include "zend_extensions.h"
+#include <ctype.h>
#undef ZEND_TEST_EXCEPTIONS
@@ -717,7 +718,7 @@
Define a new constant */
ZEND_FUNCTION(define)
{
- char *name;
+ char *name, *p;
int name_len;
zval *val;
zval *val_free = NULL;
@@ -729,6 +730,40 @@
return;
}
+ /* check if class constant */
+ if ((p = memchr(name, ':', name_len))) {
+ char *s = name;
+ zend_class_entry **ce;
+
+ if (*(p + 1) != ':') { /* invalid constant specifier */
+ RETURN_FALSE;
+ } else if ((p + 2) >= (name + name_len)) { /* constant name length < 1 */
+ zend_error(E_WARNING, "Constants name cannot be empty");
+ RETURN_FALSE;
+ } else if (zend_lookup_class(s, (p - s), &ce TSRMLS_CC) != SUCCESS) { /* invalid class name */
+ zend_error(E_WARNING, "Class does not exists");
+ RETURN_FALSE;
+ } else { /* check of constant name contains invalid chars */
+ int ok = 1;
+ p += 2; /* move beyond :: to 1st char of constant's name */
+
+ if (!isalpha(*p) && *p != '_') {
+ ok = 0;
+ }
+
+ while (ok && *++p) {
+ if (!isalnum(*p) && *p != '_') {
+ ok = 0;
+ break;
+ }
+ }
+
+ if (!ok) {
+ RETURN_FALSE;
+ }
+ }
+ }
+
if(non_cs) {
case_sensitive = 0;
}