From 72027cd0848f1a5c580c601573448cdea9b095ca Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Wed, 28 Aug 2013 20:33:42 -0700 Subject: Fix bug #65579 (Using traits with get_class_methods causes segfault). Specifically, this checks if there are trait aliases defined in the class scope before attempting to dereference the first trait alias. This handles the case where a trait alias was used in a child trait but no aliases exist in the concrete class. --- NEWS | 2 ++ Zend/tests/bug65579.phpt | 29 +++++++++++++++++++++++++++++ Zend/zend_API.c | 17 +++++++++-------- 3 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 Zend/tests/bug65579.phpt diff --git a/NEWS b/NEWS index 093fa20626..b718a74e45 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ PHP NEWS ?? ??? 2013, PHP 5.4.20 - Core: + . Fixed bug #65579 (Using traits with get_class_methods causes segfault). + (Adam) . Fixed bug #65490 (Duplicate calls to get lineno & filename for DTRACE_FUNCTION_*). (Chris Jones) . Fixed bug #65483 (quoted-printable encode stream filter incorrectly encoding diff --git a/Zend/tests/bug65579.phpt b/Zend/tests/bug65579.phpt new file mode 100644 index 0000000000..25d74ed4f5 --- /dev/null +++ b/Zend/tests/bug65579.phpt @@ -0,0 +1,29 @@ +--TEST-- +Bug #65579 (Using traits with get_class_methods causes segfault) +--FILE-- + +--EXPECT-- +array(2) { + [0]=> + string(10) "testMethod" + [1]=> + string(25) "testmethodfromparenttrait" +} diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 90d27b7987..870a9b6480 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3917,15 +3917,16 @@ ZEND_API const char* zend_find_alias_name(zend_class_entry *ce, const char *name { zend_trait_alias *alias, **alias_ptr; - alias_ptr = ce->trait_aliases; - alias = *alias_ptr; - while (alias) { - if (alias->alias_len == len && - !strncasecmp(name, alias->alias, alias->alias_len)) { - return alias->alias; - } - alias_ptr++; + if (alias_ptr = ce->trait_aliases) { alias = *alias_ptr; + while (alias) { + if (alias->alias_len == len && + !strncasecmp(name, alias->alias, alias->alias_len)) { + return alias->alias; + } + alias_ptr++; + alias = *alias_ptr; + } } return name; -- cgit v1.2.1 From 747daa53546bfa2c4a0fd88d2d3dffd30356c1ad Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Thu, 29 Aug 2013 14:02:15 +0800 Subject: Avoid compiler warning --- Zend/zend_API.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 870a9b6480..620a8f0a27 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3917,7 +3917,7 @@ ZEND_API const char* zend_find_alias_name(zend_class_entry *ce, const char *name { zend_trait_alias *alias, **alias_ptr; - if (alias_ptr = ce->trait_aliases) { + if ((alias_ptr = ce->trait_aliases)) { alias = *alias_ptr; while (alias) { if (alias->alias_len == len && -- cgit v1.2.1 From 15694f66b2732962b760463803a68a1fa3bb098f Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 29 Aug 2013 11:12:06 +0400 Subject: Fixed bug #61759 (class_alias() should accept classes with leading backslashes). (Julien) --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index b718a74e45..6169cd0902 100644 --- a/NEWS +++ b/NEWS @@ -20,6 +20,8 @@ PHP NEWS . Fixed bug #65225 (PHP_BINARY incorrectly set). (Patrick Allaert) . Improved fix for bug #63186 (compile failure on netbsd). (Matteo) . Fixed bug #62692 (PHP fails to build with DTrace). (Chris Jones, Kris Van Hees) + . Fixed bug #61759 (class_alias() should accept classes with leading + backslashes). (Julien) . Fixed bug #61345 (CGI mode - make install don't work). (Michael Heimpold) . Cherry-picked some DTrace build commits (allowing builds on Linux, bug #62691, and bug #63706) from PHP 5.5 branch -- cgit v1.2.1 From dfc6feb6e84f27094e6a2e3947caa094f7c35d26 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 29 Aug 2013 11:16:56 +0400 Subject: Fixed bug #61759 (class_alias() should accept classes with leading backslashes). (Julien) --- Zend/zend_API.c | 7 ++++++- Zend/zend_builtin_functions.c | 9 +-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 620a8f0a27..125a1a2564 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2514,7 +2514,12 @@ ZEND_API int zend_register_class_alias_ex(const char *name, int name_len, zend_c char *lcname = zend_str_tolower_dup(name, name_len); int ret; - ret = zend_hash_add(CG(class_table), lcname, name_len+1, &ce, sizeof(zend_class_entry *), NULL); + if (lcname[0] == '\\') { + ret = zend_hash_add(CG(class_table), lcname+1, name_len, &ce, sizeof(zend_class_entry *), NULL); + } else { + ret = zend_hash_add(CG(class_table), lcname, name_len+1, &ce, sizeof(zend_class_entry *), NULL); + } + efree(lcname); if (ret == SUCCESS) { ce->refcount++; diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 72d905848a..04f4ebec26 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -1399,15 +1399,8 @@ ZEND_FUNCTION(class_alias) return; } - if (!autoload) { - lc_name = do_alloca(class_name_len + 1, use_heap); - zend_str_tolower_copy(lc_name, class_name, class_name_len); + found = zend_lookup_class_ex(class_name, class_name_len, NULL, autoload, &ce TSRMLS_CC); - found = zend_hash_find(EG(class_table), lc_name, class_name_len+1, (void **) &ce); - free_alloca(lc_name, use_heap); - } else { - found = zend_lookup_class(class_name, class_name_len, &ce TSRMLS_CC); - } if (found == SUCCESS) { if ((*ce)->type == ZEND_USER_CLASS) { if (zend_register_class_alias_ex(alias_name, alias_name_len, *ce TSRMLS_CC) == SUCCESS) { -- cgit v1.2.1