Commit:    157ccaf507b7a94c43db4ec1b7321aac5cc68e8b
Author:    Xinchen Hui <larue...@php.net>         Tue, 25 Jun 2013 13:47:50 
+0800
Parents:   efd3c72de3e736758b5a94194228ea1415049789
Branches:  PHP-5.5 master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=157ccaf507b7a94c43db4ec1b7321aac5cc68e8b

Log:
Fixed bug #64827 Segfault in zval_mark_grey (zend_gc.c)

I can not get a reproduce script since the context is very strict.

Of course I will try to make one, but for now, I just commit this first.

Bugs:
https://bugs.php.net/64827

Changed paths:
  M  NEWS
  M  ext/opcache/ZendAccelerator.c


Diff:
diff --git a/NEWS b/NEWS
index ee3d858..18eedd3 100644
--- a/NEWS
+++ b/NEWS
@@ -9,6 +9,7 @@ PHP                                                             
           NEWS
     (David Soria Parra, Laruence)
 
 - OPcache
+  . Fixed bug #64827 (Segfault in zval_mark_grey (zend_gc.c)). (Laruence)
   . OPcache must be compatible with LiteSpeed SAPI (Dmitry)
 
 - CLI server:
diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c
index 4d98397..efd902f 100644
--- a/ext/opcache/ZendAccelerator.c
+++ b/ext/opcache/ZendAccelerator.c
@@ -2163,7 +2163,10 @@ static void accel_fast_zval_ptr_dtor(zval **zval_ptr)
                        case IS_CONSTANT_ARRAY: {
                                        TSRMLS_FETCH();
 
+                                       GC_REMOVE_ZVAL_FROM_BUFFER(zvalue);
                                        if (zvalue->value.ht && 
(zvalue->value.ht != &EG(symbol_table))) {
+                                               /* break possible cycles */
+                                               Z_TYPE_P(zvalue) = IS_NULL;
                                                zvalue->value.ht->pDestructor = 
(dtor_func_t)accel_fast_zval_ptr_dtor;
                                                
accel_fast_hash_destroy(zvalue->value.ht);
                                        }
@@ -2173,6 +2176,7 @@ static void accel_fast_zval_ptr_dtor(zval **zval_ptr)
                                {
                                        TSRMLS_FETCH();
 
+                                       GC_REMOVE_ZVAL_FROM_BUFFER(zvalue);
                                        Z_OBJ_HT_P(zvalue)->del_ref(zvalue 
TSRMLS_CC);
                                }
                                break;


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to