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.
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
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 aNULL
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.