summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-07-29 16:57:57 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-07-29 16:57:57 +0200
commitbbed5564eb8155efb14146e11ef0ad67edb20e28 (patch)
tree5a80e7acda14d85a24e70a645ac6dbd97dc81ec8
parent76683ea999ad1523dc308e1011925ff9952bd6d7 (diff)
parent38f1288b6427fc9e2fa2b5ad9912745ded923ee7 (diff)
downloadphp-git-bbed5564eb8155efb14146e11ef0ad67edb20e28.tar.gz
Merge branch 'PHP-7.2' into PHP-7.3
-rw-r--r--Zend/zend_signal.c21
-rw-r--r--ext/opcache/ZendAccelerator.c11
-rw-r--r--main/main.c5
3 files changed, 31 insertions, 6 deletions
diff --git a/Zend/zend_signal.c b/Zend/zend_signal.c
index 4f05579b2c..45c6335285 100644
--- a/Zend/zend_signal.c
+++ b/Zend/zend_signal.c
@@ -328,13 +328,13 @@ void zend_signal_activate(void)
SIGG(active) = 1;
SIGG(depth) = 0;
+ SIGG(check) = ZEND_DEBUG;
} /* }}} */
/* {{{ zend_signal_deactivate
* */
void zend_signal_deactivate(void)
{
-
if (SIGG(check)) {
size_t x;
struct sigaction sa;
@@ -342,21 +342,32 @@ void zend_signal_deactivate(void)
if (SIGG(depth) != 0) {
zend_error(E_CORE_WARNING, "zend_signal: shutdown with non-zero blocking depth (%d)", SIGG(depth));
}
+
/* did anyone steal our installed handler */
for (x = 0; x < sizeof(zend_sigs) / sizeof(*zend_sigs); x++) {
sigaction(zend_sigs[x], NULL, &sa);
- if (sa.sa_sigaction != zend_signal_handler_defer) {
+ if (sa.sa_sigaction != zend_signal_handler_defer &&
+ sa.sa_sigaction != (void *) SIG_IGN) {
zend_error(E_CORE_WARNING, "zend_signal: handler was replaced for signal (%d) after startup", zend_sigs[x]);
}
}
}
- SIGNAL_BEGIN_CRITICAL();
- SIGG(active) = 0;
+ /* After active=0 is set, signal handlers will be called directly and other
+ * state that is reset below will not be accessed. */
+ *((volatile int *) &SIGG(active)) = 0;
+
SIGG(running) = 0;
SIGG(blocked) = 0;
SIGG(depth) = 0;
- SIGNAL_END_CRITICAL();
+
+ /* If there are any queued signals because of a missed unblock, drop them. */
+ if (SIGG(phead) && SIGG(ptail)) {
+ SIGG(ptail)->next = SIGG(pavail);
+ SIGG(pavail) = SIGG(phead);
+ SIGG(phead) = NULL;
+ SIGG(ptail) = NULL;
+ }
}
/* }}} */
diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c
index 90397bf8d7..80f94eaf28 100644
--- a/ext/opcache/ZendAccelerator.c
+++ b/ext/opcache/ZendAccelerator.c
@@ -1707,7 +1707,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), ZSTR_LEN(file_handle->opened_path))) {
+ SHM_UNPROTECT();
ZCSG(blacklist_misses)++;
+ SHM_PROTECT();
*op_array_p = accelerator_orig_compile_file(file_handle, type);
return NULL;
}
@@ -1738,7 +1740,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;
}
@@ -2149,11 +2153,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);
}
diff --git a/main/main.c b/main/main.c
index 98c0a26f43..f729c2e275 100644
--- a/main/main.c
+++ b/main/main.c
@@ -1958,6 +1958,11 @@ void php_request_shutdown(void *dummy)
zend_unset_timeout();
} zend_end_try();
+ /* 17. Deactivate Zend signals */
+#ifdef ZEND_SIGNALS
+ zend_signal_deactivate();
+#endif
+
#ifdef PHP_WIN32
if (PG(com_initialized)) {
CoUninitialize();