Bug #73402 [Opn->Csd]: Opcache segfault when using class constant to call a method

From: Date: Sat, 29 Oct 2016 15:44:59 +0000
Subject: Bug #73402 [Opn->Csd]: Opcache segfault when using class constant to call a method
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-205058@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=73402&edit=1 ID: 73402 Updated by: laruence@php.net Reported by: sachavav at tut dot by Summary: Opcache segfault when using class constant to call a method -Status: Open +Status: Closed Type: Bug Package: opcache Operating System: Linux Ubuntu 16.04 PHP Version: 5.6.27 Block user comment: N Private report: N New Comment: Automatic comment on behalf of laruence@gmail.com Revision: http://git.php.net/?p=php-src.git;a=commit;h=ef75ddd4f98e0155e698387ab7ef052a0174278a Log: Fixed bug #73402 (Opcache segfault when using class constant to call a method) Previous Comments: ------------------------------------------------------------------------ [2016-10-27 13:26:38] sachavav at tut dot by Description: ------------ Code that uses class constant to call a method it produces segmentation fault when opcache is enabled. E.g. $this->{self::SOME_METHOD}();. The same code works well without opcache. To reproduce it create files as in test scripts, enable opcache in CLI (opcache.enable_cli=1), run php test.php. See backtrace from gdb in actual results section. When using php compiled with debug (with opcache enabled), it gives different results: [Thu Oct 27 15:35:25 2016] Script: '/home/alex/work/www/sugar/Mango/build/rome/builds/ult/sugarcrm/test/test.php' --------------------------------------- /home/alex/.phpbrew/build/5.6.27-deubg/ext/opcache/ZendAccelerator.c(380) : Block 0x7f177b3ff390 status: Beginning: Cached Freed (invalid) Start: OK End: OK --------------------------------------- PHP Fatal error: Call to undefined method Logger::info() in /home/alex/work/www/sugar/Mango/build/rome/builds/ult/sugarcrm/test/B.php on line 11 Fatal error: Call to undefined method Logger::info() in /home/alex/work/www/sugar/Mango/build/rome/builds/ult/sugarcrm/test/B.php on line 11 Test script: --------------- Logger.php: <?php class Logger { public function info($message) { echo $message . PHP_EOL; } } B.php: <?php require_once 'Logger.php'; class B { const LOG_LEVEL = 'info'; public function test() { $this->logger = new \Logger(); $this->logger->{self::LOG_LEVEL}('test'); } } test.php: <?php require_once 'B.php'; $t = new B(); $t->test(); Expected result: ---------------- Without opcache script just outputs 'test' Actual result: -------------- Program received signal SIGSEGV, Segmentation fault. _zend_mm_alloc_int (heap=0x104d010, size=8) at /home/alex/.phpbrew/build/php-5.6.26/Zend/zend_alloc.c:1910 1910 heap->cache[index] = best_fit->prev_free_block; (gdb) backtrace #0 _zend_mm_alloc_int (heap=0x104d010, size=8) at /home/alex/.phpbrew/build/php-5.6.26/Zend/zend_alloc.c:1910 #1 0x0000000000705559 in _estrndup (s=0x7ffff7fb3438 "message", length=length@entry=7) at /home/alex/.phpbrew/build/php-5.6.26/Zend/zend_alloc.c:2659 #2 0x0000000000716863 in zend_do_receive_param (op=op@entry=63 '?', varname=varname@entry=0x7fffffff7bf8, initialization=initialization@entry=0x0, class_type=class_type@entry=0x7fffffff7b80, pass_by_reference=<optimized out>, is_variadic=<optimized out>) at /home/alex/.phpbrew/build/php-5.6.26/Zend/zend_compile.c:1918 #3 0x00000000006ee3dc in zendparse () at /home/alex/.phpbrew/build/php-5.6.26/Zend/zend_language_parser.c:4495 #4 0x00000000006f3941 in compile_file (file_handle=0x7fffffff9ec0, type=8) at Zend/zend_language_scanner.l:586 #5 0x00000000005a6480 in phar_compile_file (file_handle=<optimized out>, type=<optimized out>) at /home/alex/.phpbrew/build/php-5.6.26/ext/phar/phar.c:3371 #6 0x00007fffee19c618 in compile_and_cache_file (file_handle=file_handle@entry=0x7fffffff9ec0, type=type@entry=8, key=key@entry=0x7fffee3b8c94 <accel_globals+372> "/home/alex/work/www/sugar/Mango/build/rome/builds/ult/sugarcrm/test/Logger.php", key_length=78, op_array_p=op_array_p@entry=0x7fffffff9da0, from_shared_memory=from_shared_memory@entry=0x7fffffff9d9c) at /home/alex/.phpbrew/build/php-5.6.26/ext/opcache/ZendAccelerator.c:1412 #7 0x00007fffee19cf53 in persistent_compile_file (file_handle=0x7fffffff9ec0, type=8) at /home/alex/.phpbrew/build/php-5.6.26/ext/opcache/ZendAccelerator.c:1658 #8 0x00000000007dad57 in ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER (execute_data=0x7ffff7f7b228) at /home/alex/.phpbrew/build/php-5.6.26/Zend/zend_vm_execute.h:2968 #9 0x0000000000769a00 in execute_ex (execute_data=0x7ffff7f7b228) at /home/alex/.phpbrew/build/php-5.6.26/Zend/zend_vm_execute.h:363 #10 0x000000000072dbc0 in zend_execute_scripts (type=type@entry=8, retval=retval@entry=0x0, file_count=file_count@entry=3) at /home/alex/.phpbrew/build/php-5.6.26/Zend/zend.c:1341 #11 0x00000000006c87f0 in php_execute_script (primary_file=primary_file@entry=0x7fffffffc4a0) at /home/alex/.phpbrew/build/php-5.6.26/main/main.c:2613 #12 0x00000000007dd4cf in do_cli (argc=2, argv=0x101d5a0) at /home/alex/.phpbrew/build/php-5.6.26/sapi/cli/php_cli.c:994 #13 0x00000000004301b1 in main (argc=2, argv=0x101d5a0) at /home/alex/.phpbrew/build/php-5.6.26/sapi/cli/php_cli.c:1378 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=73402&edit=1

« previous php.bugs (#205058) next »