diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-07-23 10:38:23 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-07-29 15:17:32 +0200 |
commit | 38f1288b6427fc9e2fa2b5ad9912745ded923ee7 (patch) | |
tree | 65df8f768367df986838b6dc72dfd7a33ee59c79 /ext | |
parent | 68fd435ba81e0208d30218b0558cccbf76b85e49 (diff) | |
download | php-git-38f1288b6427fc9e2fa2b5ad9912745ded923ee7.tar.gz |
Fix Zend signals unblocking
There are a few parts here:
* opcache should not be blocking signals while invoking compile_file,
otherwise signals may remain blocked on a compile error. While at
it, also protect SHM memory during compile_file.
* We should deactivate Zend signals at the end of the request, to make
sure that we gracefully recover from a missing unblock and signals
don't remain blocked forever.
* We don't use a critical section in deactivation, because it should
not be necessary. Additionally we want to clean up the signal queue,
if it is non-empty.
* Enable SIGG(check) in debug builds so we notice issues in the future.
Diffstat (limited to 'ext')
-rw-r--r-- | ext/opcache/ZendAccelerator.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 1562922424..58016ce191 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -1570,7 +1570,9 @@ static zend_persistent_script *opcache_compile_file(zend_file_handle *file_handl /* check blacklist right after ensuring that file was opened */ if (file_handle->opened_path && zend_accel_blacklist_is_blacklisted(&accel_blacklist, ZSTR_VAL(file_handle->opened_path))) { + SHM_UNPROTECT(); ZCSG(blacklist_misses)++; + SHM_PROTECT(); *op_array_p = accelerator_orig_compile_file(file_handle, type); return NULL; } @@ -1601,7 +1603,9 @@ static zend_persistent_script *opcache_compile_file(zend_file_handle *file_handl } if (ZCG(accel_directives).max_file_size > 0 && size > (size_t)ZCG(accel_directives).max_file_size) { + SHM_UNPROTECT(); ZCSG(blacklist_misses)++; + SHM_PROTECT(); *op_array_p = accelerator_orig_compile_file(file_handle, type); return NULL; } @@ -2003,11 +2007,16 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type) return accelerator_orig_compile_file(file_handle, type); } + SHM_PROTECT(); + HANDLE_UNBLOCK_INTERRUPTIONS(); + persistent_script = opcache_compile_file(file_handle, type, key, &op_array); + HANDLE_BLOCK_INTERRUPTIONS(); + SHM_UNPROTECT(); + /* Try and cache the script and assume that it is returned from_shared_memory. * If it isn't compile_and_cache_file() changes the flag to 0 */ from_shared_memory = 0; - persistent_script = opcache_compile_file(file_handle, type, key, &op_array); if (persistent_script) { persistent_script = cache_script_in_shared_memory(persistent_script, key, key ? key_length : 0, &from_shared_memory); } |