Edit report at https://bugs.php.net/bug.php?id=63219&edit=1
ID: 63219 Updated by: dmi...@php.net Reported by: maciej dot sz at gmail dot com Summary: Segfault when aliasing trait method when autoloader throws excpetion Status: Assigned Type: Bug Package: Reproducible crash Operating System: 3.2.0-31-generic #50-Ubuntu PHP Version: 5.4Git-2012-10-04 (snap) -Assigned To: dmitry +Assigned To: laruence Block user comment: N Private report: N New Comment: I think you patch is OK. Please commit it. Previous Comments: ------------------------------------------------------------------------ [2012-10-05 01:57:57] larue...@php.net I think there is no need to call autoload in USE block, and it should check the fetch result, I have attached a patch, but I am not sure what the warning message should be... ------------------------------------------------------------------------ [2012-10-05 01:56:09] larue...@php.net The following patch has been added/updated: Patch Name: bug63219.patch Revision: 1349402169 URL: https://bugs.php.net/patch-display.php?bug=63219&patch=bug63219.patch&revision=1349402169 ------------------------------------------------------------------------ [2012-10-04 18:43:59] maciej dot sz at gmail dot com Description: ------------ Class contains "use" statement of a trait. Method alias statement for that trait contains a typo in the trait name. The autoloader throws exception and then the segfault occurs. (gdb) p zend_fetch_class(cur_method_ref->class_name, cur_method_ref->cname_len, 14) $5 = (zend_class_entry *) 0x0 Test script: --------------- --------------- file TFoo.php <?php trait TFoo { public function fooMethod(){} } --------------- file C.php <?php class C { use TFoo { TFoooo::fooMethod as tf; // typo } } ---------------- file index.php <?php set_include_path( realpath(__DIR__ . '/..') . PATH_SEPARATOR . get_include_path() ); spl_autoload_register(function($cname){ $fname = $cname . '.php'; if ( ! stream_resolve_include_path($fname) ) { throw new \Exception('could not load'); } include $fname; }); $C = new C(); Expected result: ---------------- zend_error(E_ERROR, "Cannot alias method of a trait not inclued in use statement"); This should occur prior to autoloading. Actual result: -------------- Program received signal SIGSEGV, Segmentation fault. 0x00000000009863c8 in _zend_is_inconsistent (ht=0x28, file=0xfb0948 "/home/maciek/Downloads/php-5.4.7/Zend/zend_hash.c", line=969) at /home/maciek/Downloads/php-5.4.7/Zend/zend_hash.c:54 54 if (ht->inconsistent==HT_OK) { (gdb) bt #0 0x00000000009863c8 in _zend_is_inconsistent (ht=0x28, file=0xfb0948 "/home/maciek/Downloads/php-5.4.7/Zend/zend_hash.c", line=969) at /home/maciek/Downloads/php-5.4.7/Zend/zend_hash.c:54 #1 0x00000000009890f5 in zend_hash_exists (ht=0x28, arKey=0x7ffff7fc5aa0 "foomethodd", nKeyLength=11) at /home/maciek/Downloads/php-5.4.7/Zend/zend_hash.c:969 #2 0x0000000000952839 in zend_traits_init_trait_structures (ce=0x7ffff7fc5108) at /home/maciek/Downloads/php-5.4.7/Zend/zend_compile.c:4037 #3 0x0000000000953a4a in zend_do_bind_traits (ce=0x7ffff7fc5108) at /home/maciek/Downloads/php-5.4.7/Zend/zend_compile.c:4370 #4 0x00000000009b79ee in ZEND_BIND_TRAITS_SPEC_HANDLER (execute_data=0x7ffff7f88500) at /home/maciek/Downloads/php-5.4.7/Zend/zend_vm_execute.h:1027 #5 0x00000000009b42f6 in execute (op_array=0x7ffff7fc0da8) at /home/maciek/Downloads/php-5.4.7/Zend/zend_vm_execute.h:410 #6 0x00000000009639b8 in zend_call_function (fci=0x7fffffffa1a0, fci_cache=0x7fffffffa1f0) at /home/maciek/Downloads/php-5.4.7/Zend/zend_execute_API.c:958 #7 0x00000000009956b5 in zend_call_method (object_pp=0x0, obj_ce=0x0, fn_proxy=0x7ffff7fc41e0, function_name=0x7ffff7fc17f8 "closure::__invoke\001", function_name_len=22, retval_ptr_ptr=0x7fffffffa2e0, param_count=1, arg1=0x7ffff7fbf5d0, arg2=0x0) at /home/maciek/Downloads/php-5.4.7/Zend/zend_interfaces.c:97 #8 0x00000000007a087c in zif_spl_autoload_call (ht=1, return_value=0x7ffff7fc40d8, return_value_ptr=0x7fffffffa728, this_ptr=0x0, return_value_used=1) at /home/maciek/Downloads/php-5.4.7/ext/spl/php_spl.c:436 #9 0x0000000000963b92 in zend_call_function (fci=0x7fffffffa670, fci_cache=0x7fffffffa6c0) at /home/maciek/Downloads/php-5.4.7/Zend/zend_execute_API.c:980 #10 0x0000000000964520 in zend_lookup_class_ex (name=0x7ffff7eb72f8 "bar\\C", name_length=5, key=0x7ffff7fc24d8, use_autoload=1, ce=0x7fffffffa7c0) at /home/maciek/Downloads/php-5.4.7/Zend/zend_execute_API.c:1127 #11 0x0000000000965230 in zend_fetch_class_by_name (class_name=0x7ffff7eb72f8 "bar\\C", class_name_len=5, key=0x7ffff7fc24d8, fetch_type=4) at /home/maciek/Downloads/php-5.4.7/Zend/zend_execute_API.c:1607 #12 0x00000000009b8690 in ZEND_FETCH_CLASS_SPEC_CONST_HANDLER (execute_data=0x7ffff7f880e8) at /home/maciek/Downloads/php-5.4.7/Zend/zend_vm_execute.h:1173 #13 0x00000000009b42f6 in execute (op_array=0x7ffff7fc04c8) at /home/maciek/Downloads/php-5.4.7/Zend/zend_vm_execute.h:410 #14 0x0000000000976e13 in zend_execute_scripts (type=8, retval=0x0, file_count=3) at /home/maciek/Downloads/php-5.4.7/Zend/zend.c:1286 #15 0x00000000008e9732 in php_execute_script (primary_file=0x7fffffffce40) at /home/maciek/Downloads/php-5.4.7/main/main.c:2473 #16 0x0000000000abfa95 in do_cli (argc=2, argv=0x7fffffffe228) at /home/maciek/Downloads/php-5.4.7/sapi/cli/php_cli.c:988 #17 0x0000000000ac0bce in main (argc=2, argv=0x7fffffffe228) at /home/maciek/Downloads/php-5.4.7/sapi/cli/php_cli.c:1364 (gdb) f 2 #2 0x0000000000952839 in zend_traits_init_trait_structures (ce=0x7ffff7fc5108) at /home/maciek/Downloads/php-5.4.7/Zend/zend_compile.c:4037 4037 method_exists = zend_hash_exists(&cur_method_ref->ce->function_table, (gdb) p *cur_method_ref $1 = {method_name = 0x7ffff7fc1558 "fooMethod", mname_len = 10, ce = 0x0, class_name = 0x7ffff7fc5798 "foo\\TFooo", cname_len = 9} (gdb) p zend_fetch_class(cur_method_ref->class_name, cur_method_ref->cname_len, 14) $2 = (zend_class_entry *) 0x0 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=63219&edit=1