From e6444b98998d451c07312c22538abefc679e06a8 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Thu, 3 Dec 2009 12:34:50 +0000 Subject: [PATCH] - Fixed bug #49472 (Constants defined in Interfaces can be overridden) --- Zend/tests/bug49472.phpt | 27 +++++++++++++++++++++++++++ Zend/tests/errmsg_025.phpt | 2 +- Zend/tests/inter_01.phpt | 2 +- Zend/zend_compile.c | 17 +++++++++++++++-- 4 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 Zend/tests/bug49472.phpt diff --git a/Zend/tests/bug49472.phpt b/Zend/tests/bug49472.phpt new file mode 100644 index 0000000000..1803d1848c --- /dev/null +++ b/Zend/tests/bug49472.phpt @@ -0,0 +1,27 @@ +--TEST-- +Bug #49472 (Constants defined in Interfaces can be overridden) +--FILE-- + +--EXPECTF-- +Fatal error: Cannot inherit previously-inherited or override constant c from interface ia in %s on line %d diff --git a/Zend/tests/errmsg_025.phpt b/Zend/tests/errmsg_025.phpt index 5b4578ac92..014b409479 100644 --- a/Zend/tests/errmsg_025.phpt +++ b/Zend/tests/errmsg_025.phpt @@ -17,4 +17,4 @@ class test implements test1, test2 { echo "Done\n"; ?> --EXPECTF-- -Fatal error: Cannot inherit previously-inherited constant FOO from interface test2 in %s on line %d +Fatal error: Cannot inherit previously-inherited or override constant FOO from interface test2 in %s on line %d diff --git a/Zend/tests/inter_01.phpt b/Zend/tests/inter_01.phpt index db2e86d206..c73397c91a 100644 --- a/Zend/tests/inter_01.phpt +++ b/Zend/tests/inter_01.phpt @@ -15,4 +15,4 @@ class foobar implements foo { } ?> --EXPECTF-- -Fatal error: Cannot inherit previously-inherited constant foo from interface foo in %s on line %d +Fatal error: Cannot inherit previously-inherited or override constant foo from interface foo in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 00f46cc37a..0304d6619e 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2938,7 +2938,7 @@ static zend_bool do_inherit_constant_check(HashTable *child_constants_table, con if (zend_u_hash_quick_find(child_constants_table, hash_key->type, hash_key->arKey, hash_key->nKeyLength, hash_key->h, (void**)&old_constant) == SUCCESS) { if (*old_constant != *parent_constant) { - zend_error(E_COMPILE_ERROR, "Cannot inherit previously-inherited constant %R from interface %v", hash_key->type, hash_key->arKey, iface->name); + zend_error(E_COMPILE_ERROR, "Cannot inherit previously-inherited or override constant %R from interface %v", hash_key->type, hash_key->arKey, iface->name); } return 0; } @@ -2946,6 +2946,16 @@ static zend_bool do_inherit_constant_check(HashTable *child_constants_table, con } /* }}} */ +static int do_interface_constant_check(zval **val TSRMLS_DC, int num_args, va_list args, const zend_hash_key *key) /* {{{ */ +{ + zend_class_entry **iface = va_arg(args, zend_class_entry**); + + do_inherit_constant_check(&(*iface)->constants_table, (const zval **) val, key, *iface); + + return ZEND_HASH_APPLY_KEEP; +} +/* }}} */ + ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface TSRMLS_DC) /* {{{ */ { zend_uint i, ignore = 0; @@ -2964,7 +2974,10 @@ ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry } } } - if (!ignore) { + if (ignore) { + /* Check for attempt to redeclare interface constants */ + zend_hash_apply_with_arguments(&ce->constants_table TSRMLS_CC, (apply_func_args_t) do_interface_constant_check, 1, &iface); + } else { if (ce->num_interfaces >= current_iface_num) { if (ce->type == ZEND_INTERNAL_CLASS) { ce->interfaces = (zend_class_entry **) realloc(ce->interfaces, sizeof(zend_class_entry *) * (++current_iface_num)); -- 2.40.0