From: Dmitry Stogov Date: Wed, 13 Jun 2007 16:48:29 +0000 (+0000) Subject: Fixed bug #41633 (Crash instantiating classes with self-referencing constants) X-Git-Tag: BEFORE_IMPORT_OF_MYSQLND~464 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0a7462e056cca670f449e3166aa420e306896187;p=php Fixed bug #41633 (Crash instantiating classes with self-referencing constants) --- diff --git a/Zend/tests/bug41633_3.phpt b/Zend/tests/bug41633_3.phpt new file mode 100755 index 0000000000..7b9452db85 --- /dev/null +++ b/Zend/tests/bug41633_3.phpt @@ -0,0 +1,12 @@ +--TEST-- +Bug #41633.3 (Crash instantiating classes with self-referencing constants) +--FILE-- + +--EXPECTF-- +Fatal error: Cannot declare self-referencing constant 'Foo::B' in %sbug41633_3.php on line %d diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 2041a3d42f..5e53e39d62 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -469,6 +469,10 @@ ZEND_API int zend_is_true(zval *op) #include "../TSRM/tsrm_strtok_r.h" +#define IS_VISITED_CONSTANT IS_CONSTANT_INDEX +#define IS_CONSTANT_VISITED(p) (Z_TYPE_P(p) & IS_VISITED_CONSTANT) +#define MARK_CONSTANT_VISITED(p) Z_TYPE_P(p) |= IS_VISITED_CONSTANT + ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *scope TSRMLS_DC) { zval *p = *pp; @@ -476,13 +480,17 @@ ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *sco zval const_value; zstr colon; - if (Z_TYPE_P(p) == IS_CONSTANT) { + if (IS_CONSTANT_VISITED(p)) { + zend_error(E_ERROR, "Cannot declare self-referencing constant '%s'", Z_STRVAL_P(p)); + } else if (Z_TYPE_P(p) == IS_CONSTANT) { int refcount; zend_uchar is_ref; SEPARATE_ZVAL_IF_NOT_REF(pp); p = *pp; + MARK_CONSTANT_VISITED(p); + refcount = p->refcount; is_ref = p->is_ref;