com php-src: Fixed bug #70843 (Segmentation fault on MacOSX with opcache.file_cache_only=1): NEWS ext/opcache/ zend_file_cache.c

From: Date: Wed, 04 Nov 2015 10:59:30 +0000
Subject: com php-src: Fixed bug #70843 (Segmentation fault on MacOSX with opcache.file_cache_only=1): NEWS ext/opcache/ zend_file_cache.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-89589@lists.php.net to get a copy of this message
Commit: fe0af271c66260fedcb4b44fad85e18dd0dd0af6 Author: Xinchen Hui <laruence@gmail.com> Wed, 4 Nov 2015 18:59:30 +0800 Parents: 2f2653aa7758cd586f1daff288146740dd5fa61b Branches: PHP-7.0 master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=fe0af271c66260fedcb4b44fad85e18dd0dd0af6 Log: Fixed bug #70843 (Segmentation fault on MacOSX with opcache.file_cache_only=1) Bugs: https://bugs..php.net/70843 Changed paths: M NEWS M ext/opcache/zend_file_cache.c Diff: diff --git a/NEWS b/NEWS index 3a0b712..43e7cf3 100644 --- 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) diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c index a2a5343..d1ea0a4 100644 --- a/ext/opcache/zend_file_cache.c +++ b/ext/opcache/zend_file_cache.c @@ -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);

« previous php.cvs (#89589) next »