Skip to content

Commit

Permalink
Fixed bug #62358 (Segfault when using traits a lot)
Browse files Browse the repository at this point in the history
  • Loading branch information
laruence committed Aug 23, 2012
1 parent 64bd455 commit 6d1bebf
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 2 deletions.
5 changes: 4 additions & 1 deletion NEWS
Expand Up @@ -13,7 +13,7 @@ PHP NEWS
. Fixed bug #62744 (dangling pointers made by zend_disable_class). (Laruence)
. Fixed bug #62716 (munmap() is called with the incorrect length).
(slangley@google.com)
. Fixed bug #62460 (php binaries installed as binary.dSYM). (Reeze Xia)
. Fixed bug #62358 (Segfault when using traits a lot). (Laruence)
. Fixed bug #62328 (implementing __toString and a cast to string fails)
(Laruence)
. Fixed bug #51363 (Fatal error raised by var_export() not caught by error
Expand All @@ -28,6 +28,9 @@ PHP NEWS
. Fixed bug #62852 (Unserialize invalid DateTime causes crash).
(reeze.xia@gmail.com)

- Installation:
. Fixed bug #62460 (php binaries installed as binary.dSYM). (Reeze Xia)

- PDO:
. Fixed bug #62685 (Wrong return datatype in PDO::inTransaction()). (Laruence)

Expand Down
32 changes: 32 additions & 0 deletions Zend/tests/bug62358.phpt
@@ -0,0 +1,32 @@
--TEST--
Bug #62358 (Segfault when using traits a lot)
--SKIPIF--
<?php
if (getenv("USE_ZEND_ALLOC") !== "0") {
die("skip Need Zend MM enabled");
}
?>
--FILE--
<?php

trait T {
public function foo() {
echo "from T";
}
}

interface I {
public function foo();
}

abstract class A implements I{
use T;
}

class B extends A {
public function foo($var) {
}
}
?>
--EXPECTF--
Strict Standards: Declaration of B::foo() should be compatible with A::foo() in %sbug62358.php on line %d
4 changes: 3 additions & 1 deletion Zend/zend_compile.c
Expand Up @@ -3786,7 +3786,6 @@ static int zend_traits_merge_functions_to_class(zend_function *fn TSRMLS_DC, int
}

fn->common.scope = ce;
fn->common.prototype = prototype;

if (prototype
&& (prototype->common.fn_flags & ZEND_ACC_IMPLEMENTED_ABSTRACT
Expand All @@ -3801,11 +3800,14 @@ static int zend_traits_merge_functions_to_class(zend_function *fn TSRMLS_DC, int
if (prototype) {
do_inheritance_check_on_method(fn, prototype TSRMLS_CC);
}

/* one more thing: make sure we properly implement an abstract method */
if (existing_fn && existing_fn->common.fn_flags & ZEND_ACC_ABSTRACT) {
do_inheritance_check_on_method(fn, existing_fn TSRMLS_CC);
}

fn->common.prototype = prototype;

/* delete inherited fn if the function to be added is not abstract */
if (existing_fn
&& existing_fn->common.scope != ce
Expand Down

0 comments on commit 6d1bebf

Please sign in to comment.