I think, I've found a more simple fix (attached) that don't require extension patching and even allow to optimize ZE a bit.

Laruence, can you please verify it.
Sorry, I'm quite busy with other tasks.

Thanks. Dmitry.

On 10/18/2012 02:56 PM, Laruence wrote:
On Thu, Oct 18, 2012 at 6:45 PM, Pierre Joye <pierre....@gmail.com> wrote:
hi Dmitry, Laruence!

On Thu, Oct 18, 2012 at 11:46 AM, Laruence <larue...@php.net> wrote:
Hey:

   recently we found a problem, that is "usage zval_dtor on a recursive
array while gc enabled"  has chance to result a segfault.

   a reproduce script could be found here:
https://github.com/php/php-src/blob/8bd5e15ff7a57791956c4017ee8fb4a8ac0d8d2e/ext/pcre/tests/bug63055.phpt

   the preg_match used to call zval_dtor on the third argument. which
result a segfault, reported at #63055

   the segfault backtrace will looks like: http://pastebin.com/uPWBgrTZ

   thanks to dmitry,  we got a simple solution,  that is:  instead of
directly call to zval_dtor, please use following codes instead:
   "
     zval garbage = *subpats;
     array_init(subpats);
     zval_dtor(&garbage);
    "
Nice catch!

We could add a macro? As it looks like many will forget to do that :)
maybe a seris macro:

ZVAL_REPLACE_LONG()
ZVAL_REPLACE_STRING{L}()
ZVAL_REPLACE_ZVAL()

etc;

thanks , will do it later,  only for trunk I think

thanks

Cheers,
--
Pierre

@pierrejoye | http://blog.thepimp.net | http://www.libgd.org




diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c
index c790108..f2a85c3 100644
--- a/Zend/zend_variables.c
+++ b/Zend/zend_variables.c
@@ -40,6 +40,9 @@ ZEND_API void _zval_dtor_func(zval *zvalue ZEND_FILE_LINE_DC)
                                TSRMLS_FETCH();
 
                                if (zvalue->value.ht && (zvalue->value.ht != 
&EG(symbol_table))) {
+                                       /* break possible cycles */
+                                       Z_TYPE_P(zvalue) = IS_NULL;
+
                                        zend_hash_destroy(zvalue->value.ht);
                                        FREE_HASHTABLE(zvalue->value.ht);
                                }
-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to