]> granicus.if.org Git - php/commitdiff
Fixed bug #70843 (Segmentation fault on MacOSX with opcache.file_cache_only=1)
authorXinchen Hui <laruence@gmail.com>
Wed, 4 Nov 2015 10:59:30 +0000 (18:59 +0800)
committerXinchen Hui <laruence@gmail.com>
Wed, 4 Nov 2015 10:59:30 +0000 (18:59 +0800)
NEWS
ext/opcache/zend_file_cache.c

diff --git a/NEWS b/NEWS
index 3a0b71286b57685f9711dbd5d3a3549827446256..43e7cf392acba692be0bac83d3d00127ea11cebf 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,8 @@ PHP                                                                        NEWS
     (Dmitry, Laruence)
 
 - Opcache:
+  . Fixed bug #70843 (Segmentation fault on MacOSX with
+    opcache.file_cache_only=1). (Laruence)
   . Fixed bug #70656 (require() statement broken after opcache_reset() or a
     few hours of use). (Laruence)
 
index a2a5343deba6a11c15137c799b6223734682138d..d1ea0a46a6a97e0256712db4a195a8911ebf9b18 100644 (file)
@@ -20,6 +20,7 @@
 #include "zend_virtual_cwd.h"
 #include "zend_compile.h"
 #include "zend_vm.h"
+#include "zend_interfaces.h"
 
 #include "php.h"
 
@@ -801,10 +802,12 @@ int zend_file_cache_script_store(zend_persistent_script *script, int in_shm)
 static void zend_file_cache_unserialize_hash(HashTable               *ht,
                                              zend_persistent_script  *script,
                                              void                    *buf,
-                                             unserialize_callback_t   func)
+                                             unserialize_callback_t   func,
+                                             dtor_func_t              dtor)
 {
        Bucket *p, *end;
 
+       ht->pDestructor = dtor;
        if (!(ht->u.flags & HASH_FLAG_INITIALIZED)) {
                HT_SET_DATA_ADDR(ht, &uninitialized_bucket);
                return;
@@ -869,7 +872,8 @@ static void zend_file_cache_unserialize_zval(zval                    *zv,
 
                                UNSERIALIZE_PTR(Z_ARR_P(zv));
                                ht = Z_ARR_P(zv);
-                               zend_file_cache_unserialize_hash(ht, script, buf, zend_file_cache_unserialize_zval);
+                               zend_file_cache_unserialize_hash(ht,
+                                               script, buf, zend_file_cache_unserialize_zval, ZVAL_PTR_DTOR);
                        }
                        break;
                case IS_REFERENCE:
@@ -904,7 +908,8 @@ static void zend_file_cache_unserialize_op_array(zend_op_array           *op_arr
 
                UNSERIALIZE_PTR(op_array->static_variables);
                ht = op_array->static_variables;
-               zend_file_cache_unserialize_hash(ht, script, buf, zend_file_cache_unserialize_zval);
+               zend_file_cache_unserialize_hash(ht,
+                               script, buf, zend_file_cache_unserialize_zval, ZVAL_PTR_DTOR);
        }
 
        if (op_array->literals && !IS_UNSERIALIZED(op_array->literals)) {
@@ -1056,7 +1061,8 @@ static void zend_file_cache_unserialize_class(zval                    *zv,
        ce = Z_PTR_P(zv);
 
        UNSERIALIZE_STR(ce->name);
-       zend_file_cache_unserialize_hash(&ce->function_table, script, buf, zend_file_cache_unserialize_func);
+       zend_file_cache_unserialize_hash(&ce->function_table,
+                       script, buf, zend_file_cache_unserialize_func, ZEND_FUNCTION_DTOR);
        if (ce->default_properties_table) {
                zval *p, *end;
 
@@ -1079,10 +1085,12 @@ static void zend_file_cache_unserialize_class(zval                    *zv,
                        p++;
                }
        }
-       zend_file_cache_unserialize_hash(&ce->constants_table, script, buf, zend_file_cache_unserialize_zval);
+       zend_file_cache_unserialize_hash(&ce->constants_table,
+                       script, buf, zend_file_cache_unserialize_zval, NULL);
        UNSERIALIZE_STR(ZEND_CE_FILENAME(ce));
        UNSERIALIZE_STR(ZEND_CE_DOC_COMMENT(ce));
-       zend_file_cache_unserialize_hash(&ce->properties_info, script, buf, zend_file_cache_unserialize_prop_info);
+       zend_file_cache_unserialize_hash(&ce->properties_info,
+                       script, buf, zend_file_cache_unserialize_prop_info, ZVAL_PTR_DTOR);
 
        if (ce->trait_aliases) {
                zend_trait_alias **p, *q;
@@ -1168,6 +1176,11 @@ static void zend_file_cache_unserialize_class(zval                    *zv,
        UNSERIALIZE_PTR(ce->__tostring);
        UNSERIALIZE_PTR(ce->__callstatic);
        UNSERIALIZE_PTR(ce->__debugInfo);
+
+       if (UNEXPECTED((ce->ce_flags & ZEND_ACC_ANON_CLASS))) {
+               ce->serialize = zend_class_serialize_deny;
+               ce->unserialize = zend_class_unserialize_deny;
+       }
 }
 
 static void zend_file_cache_unserialize(zend_persistent_script  *script,
@@ -1177,8 +1190,10 @@ static void zend_file_cache_unserialize(zend_persistent_script  *script,
 
        UNSERIALIZE_STR(script->full_path);
 
-       zend_file_cache_unserialize_hash(&script->class_table, script, buf, zend_file_cache_unserialize_class);
-       zend_file_cache_unserialize_hash(&script->function_table, script, buf, zend_file_cache_unserialize_func);
+       zend_file_cache_unserialize_hash(&script->class_table,
+                       script, buf, zend_file_cache_unserialize_class, ZEND_CLASS_DTOR);
+       zend_file_cache_unserialize_hash(&script->function_table,
+                       script, buf, zend_file_cache_unserialize_func, ZEND_FUNCTION_DTOR);
        zend_file_cache_unserialize_op_array(&script->main_op_array, script, buf);
 
        UNSERIALIZE_PTR(script->arena_mem);