Re: Issues with exceptions and overloading opcodes

From: Date: Tue, 20 Oct 2015 19:05:30 +0000
Subject: Re: Issues with exceptions and overloading opcodes
References: 1 2 3 4  Groups: php.internals 
Request: Send a blank email to internals+get-88895@lists.php.net to get a copy of this message
> Am 20.10.2015 um 18:08 schrieb Derick Rethans <derick@php.net>: > > On Tue, 20 Oct 2015, Bob Weinand wrote: > >>> Am 20.10.2015 um 17:11 schrieb Xinchen Hui <laruence@php.net>: >>> >>> On Tue, Oct 20, 2015 at 10:45 PM, Derick Rethans <derick@php.net >>> <mailto:derick@php.net>> wrote: >>> >>>> When hacking on Xdebug for PHP 7, I ran into some issues where PHP >>>> would just spin around. This happens when there is an exception, >>>> and I use overloaded opcodes. I wrote a small example extension at >>>> >>>> https://github.com/derickr/php-minimal-opcode-overloading-example >>>> with a test case ( >>>> >>>> https://github.com/derickr/php-minimal-opcode-overloading-example/blob/master/tests/test.php >>>> >>>> ) that shows that something is looping in executing opcodes, as the >>>> HANDLE_EXCEPTION iirc doesn't advance to the next opline. I believe >>>> this is a recent enough change, as it only started happening after >>>> I upgraded from about RC1 to latest master. >>>> >>>> Would you care to have a look? >>>> >>> This is introduced by a fix made by Bob, >>> https://github.com/php/php-src/commit/808f62bb >>> <https://github.com/php/php-src/commit/808f62bb> >>> >>> Bob, I am going to revert this for now, since you didn't include a >>> test script to show where the problem was, I am not sure why you >>> made this? >> >> I didn't add any test case as we don't have any APIs in php-src using >> that user_opcode handler. I discussed the change back then with Dmitry >> and committed with his review. >> >> It concretely broke uopz which might throw an exception itself. And in >> turn we realized that for integrity we need to ensure that opline == >> EX(opline) else we'll end up with different behavior in global >> register builds and normal builds. >> >> In general, you should not overload ZEND_HANDLE_EXCEPTION (if you need >> to, have a special handling for it, but never directly dispatch to >> it). It is quite special being the only opcode actually allowing >> EG(exception) to be non-NULL at the start of it. >> >> You are doing an #ifdef ZTS to exempt it… why don't you always exempt >> it? > > Even if I do (like I've just pushed into the extension), the test still > fails because the code loops. So you did break something. > > cheers, > Derick > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php Ah, ZEND_CATCH indeed also allows EG(exception) to be non-null… … maybe I should write if (EG(exception) && opline->opcode != ZEND_HANDLE_EXCEPTION && opline->opcode != ZEND_CATCH && ret != ZEND_USER_OPCODE_DISPATCH && ret != ZEND_USER_OPCODE_RETURN && ret != ZEND_USER_OPCODE_ENTER && ret != ZEND_USER_OPCODE_LEAVE) { HANDLE_EXCEPTION(); } to allow dispatching for these two opcodes too? Bob

« previous php.internals (#88895) next »