Commit:    67611c67fa5a3b2c199d41ef7df3307308c56faa
Author:    Xinchen Hui <larue...@php.net>         Mon, 8 Oct 2012 22:59:52 +0800
Parents:   9a99426e802f554237658a5e8e8fe4c91ddf716a
Branches:  PHP-5.4

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=67611c67fa5a3b2c199d41ef7df3307308c56faa

Log:
Fixed bug #63219 (Segfault when aliasing trait method when autoloader throws 
excpetion)

Bugs:
https://bugs.php.net/63219

Changed paths:
  M  NEWS
  A  Zend/tests/bug63219.phpt
  M  Zend/zend_compile.c


Diff:
diff --git a/NEWS b/NEWS
index 1924864..fcd3bdd 100644
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,8 @@ PHP                                                           
             NEWS
     (Lars)
 
 - Core:
+  . Fixed bug #63219 (Segfault when aliasing trait method when autoloader
+    throws excpetion). (Laruence)
   . Added optional second argument for assert() to specify custom message. 
Patch
     by Lonny Kapelushnik (lo...@lonnylot.com). (Lars)
   . Support building PHP with the native client toolchain. (Stuart Langley)
diff --git a/Zend/tests/bug63219.phpt b/Zend/tests/bug63219.phpt
new file mode 100644
index 0000000..999be4a
--- /dev/null
+++ b/Zend/tests/bug63219.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Bug #63219 (Segfault when aliasing trait method when autoloader throws 
excpetion)
+--FILE--
+<?php
+trait TFoo {
+    public function fooMethod(){}
+}
+
+class C {
+    use TFoo {
+        Typo::fooMethod as tf;
+    }
+}
+
+echo "okey";
+?>
+--EXPECTF--
+Fatal error: Could not find trait Typo in %sbug63219.php on line %d
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index c39d8ea..303eedb 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -3975,8 +3975,10 @@ static void 
zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /*
                        /** Resolve classes for all precedence operations. */
                        if (cur_precedence->exclude_from_classes) {
                                cur_method_ref = cur_precedence->trait_method;
-                               cur_precedence->trait_method->ce = 
zend_fetch_class(cur_method_ref->class_name,
-                                                                               
                                                        
cur_method_ref->cname_len, ZEND_FETCH_CLASS_TRAIT TSRMLS_CC);
+                               if (!(cur_precedence->trait_method->ce = 
zend_fetch_class(cur_method_ref->class_name, cur_method_ref->cname_len,
+                                                               
ZEND_FETCH_CLASS_TRAIT|ZEND_FETCH_CLASS_NO_AUTOLOAD TSRMLS_CC))) {
+                                       zend_error(E_COMPILE_ERROR, "Could not 
find trait %s", cur_method_ref->class_name);
+                               }
 
                                /** Ensure that the prefered method is actually 
available. */
                                lcname = 
zend_str_tolower_dup(cur_method_ref->method_name,
@@ -4003,7 +4005,9 @@ static void 
zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /*
                                        char* class_name = 
(char*)cur_precedence->exclude_from_classes[j];
                                        zend_uint name_length = 
strlen(class_name);
 
-                                       cur_precedence->exclude_from_classes[j] 
= zend_fetch_class(class_name, name_length, ZEND_FETCH_CLASS_TRAIT TSRMLS_CC);
+                                       if 
(!(cur_precedence->exclude_from_classes[j] = zend_fetch_class(class_name, 
name_length, ZEND_FETCH_CLASS_TRAIT |ZEND_FETCH_CLASS_NO_AUTOLOAD TSRMLS_CC))) {
+                                               zend_error(E_COMPILE_ERROR, 
"Could not find trait %s", class_name);
+                                       }
                                        
                                        /* make sure that the trait method is 
not from a class mentioned in
                                         exclude_from_classes, for consistency 
*/
@@ -4030,7 +4034,9 @@ static void 
zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /*
                        /** For all aliases with an explicit class name, 
resolve the class now. */
                        if (ce->trait_aliases[i]->trait_method->class_name) {
                                cur_method_ref = 
ce->trait_aliases[i]->trait_method;
-                               cur_method_ref->ce = 
zend_fetch_class(cur_method_ref->class_name, cur_method_ref->cname_len, 
ZEND_FETCH_CLASS_TRAIT TSRMLS_CC);
+                               if (!(cur_method_ref->ce = 
zend_fetch_class(cur_method_ref->class_name, cur_method_ref->cname_len, 
ZEND_FETCH_CLASS_TRAIT|ZEND_FETCH_CLASS_NO_AUTOLOAD TSRMLS_CC))) {
+                                       zend_error(E_COMPILE_ERROR, "Could not 
find trait %s", cur_method_ref->class_name);
+                               }
 
                                /** And, ensure that the referenced method is 
resolvable, too. */
                                lcname = 
zend_str_tolower_dup(cur_method_ref->method_name,


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to