The attatched patch solves the problem and I think it is more robust then adding a new function. calling a function like the proposed zend_restore_user_opcode_handler() might be a problem in case someone else put handler before you. instead of that it's easier to just tell zend_set_user_opcode_handler() to restore the opcode value in case the handler is NULL. that will make the flow of zend_set_user_opcode_handler(<my_handler>) and then zend_set_user_opcode_handler(<orig_handler>) simpler.
a patch is attatched and tested. On Sunday, February 12, 2012 02:41:44 PM Laruence wrote: > Hi: > could you file a feature req on bugs.php.net? > > I think it's okey to add a zend_restore_user_handler . > > like: > > ZEND_API int zend_restore_user_opcode_handler(zend_uchar opcode) { > zend_user_opcodes[opcode] = opcode; > zend_user_opcode_handlers[opcode] = NULL; > return SUCCESS; > } > > but it still need dmitry to review :) > > thanks > > On Sun, Feb 12, 2012 at 8:09 PM, yoram bar haim <yora...@zend.com> wrote: > > I first saw this problem while addapting extension to PHP 5.4 but the > > code is the same in 5.3 : > > when you call zend_set_user_opcode_handler() it set's a pointer (handler) > > in zend_user_opcode_handlers and a uint opcode value in > > zend_user_opcodes to ZEND_USER_OPCODE . > > > > you can call zend_set_user_opcode_handler with the original handler to > > restore it, but if the original state did not include ZEND_USER_OPCODE > > you have no way to restore it. > > > > Why restoring ? > > On mac, static variables are not re-initialized on dlclose()+dlopen(). > > that means that apache reload does not re-create > > zend_user_opcode_handlers and zend_user_opcodes. > > if your extension sets user_opcode_handler and is not reloaded in apache > > reload (because you commented it in php.ini, for example), your handlers > > array will actually point to non-exist handler. > > if you will call zend_set_user_opcode_handler() with the original handler > > at MSHUTDOWN, it will restore the handler but zend_user_opcodes[<opcode] > > will still be ZEND_USER_OPCODE so you will end up calling a NULL > > handler. > > > > we should eather allow zend_set_user_opcode_handler to also set the value > > in zend_user_opcodes[<opcode>] or we should build those arrayes from > > scratch at php_module_init. > > > > currently an extension tha calls zend_set_user_opcode_handler() will make > > PHP crash on mac after disabling the extension and apache reload. > > > > -- > > PHP Internals - PHP Runtime Development Mailing List > > To unsubscribe, visit: http://www.php.net/unsub.php
--- Zend/zend_execute.c.orig 2012-02-12 14:32:07.000000000 +0200 +++ Zend/zend_execute.c 2012-02-12 14:31:33.000000000 +0200 @@ -1512,7 +1512,11 @@ ZEND_API int zend_set_user_opcode_handler(zend_uchar opcode, user_opcode_handler_t handler) { if (opcode != ZEND_USER_OPCODE) { - zend_user_opcodes[opcode] = ZEND_USER_OPCODE; + if (handler == NULL) { + zend_user_opcodes[opcode] = opcode; + } else { + zend_user_opcodes[opcode] = ZEND_USER_OPCODE; + } zend_user_opcode_handlers[opcode] = handler; return SUCCESS; }
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php