com php-src: Fix bug #65579 (Using traits with get_class_me thods causes segfault).: NEWS Zend/tests/bug6 5579.phpt Zend/zend_API.c
| From: | Xinchen Hui | Date: | Thu, 29 Aug 2013 03:33:42 +0000 |
| Subject: | com php-src: Fix bug #65579 (Using traits with get_class_me thods causes segfault).: NEWS Zend/tests/bug6 5579.phpt Zend/zend_API.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-73124@lists.php.net to get a copy of this message | ||
Commit: 72027cd0848f1a5c580c601573448cdea9b095ca
Author: Adam Harvey <aharvey@php.net> Wed, 28 Aug 2013 20:33:42 -0700
Parents: 3745bdadc03a146fd37a3528658abc86bc8494df
Branches: PHP-5.4 PHP-5.5 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=72027cd0848f1a5c580c601573448cdea9b095ca
Log:
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.
Bugs:
https://bugs.php.net/65579
Changed paths:
M NEWS
A Zend/tests/bug65579.phpt
M Zend/zend_API.c
Diff:
diff --git a/NEWS b/NEWS
index 093fa20..b718a74 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 0000000..25d74ed
--- /dev/null
+++ b/Zend/tests/bug65579.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Bug #65579 (Using traits with get_class_methods causes segfault)
+--FILE--
+<?php
+trait ParentTrait {
+ public function testMethod() { }
+}
+
+trait ChildTrait {
+ use ParentTrait {
+ testMethod as testMethodFromParentTrait;
+ }
+ public function testMethod() { }
+}
+
+class TestClass {
+ use ChildTrait;
+}
+
+$obj = new TestClass();
+var_dump(get_class_methods($obj));
+?>
+--EXPECT--
+array(2) {
+ [0]=>
+ string(10) "testMethod"
+ [1]=>
+ string(25) "testmethodfromparenttrait"
+}
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 90d27b7..870a9b6 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;