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

Reply via email to