From eb8c07fe2f081a5e270f19c329180469d66142bb Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 25 Mar 2019 15:23:11 +0100 Subject: [PATCH] Support VirtualProtect for opcache.protect_memory Don't enable this on AppVeyor yet, as there is still an open issue in phar. --- ext/opcache/ZendAccelerator.c | 4 ++++ ext/opcache/zend_shared_alloc.c | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 0bdee2bfe03..56651f2d4c8 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -305,7 +305,9 @@ static inline int accel_restart_is_active(void) static inline int accel_activate_add(void) { #ifdef ZEND_WIN32 + SHM_UNPROTECT(); INCREMENT(mem_usage); + SHM_PROTECT(); #else struct flock mem_usage_lock; @@ -327,8 +329,10 @@ static inline void accel_deactivate_sub(void) { #ifdef ZEND_WIN32 if (ZCG(counted)) { + SHM_UNPROTECT(); DECREMENT(mem_usage); ZCG(counted) = 0; + SHM_PROTECT(); } #else struct flock mem_usage_unlock; diff --git a/ext/opcache/zend_shared_alloc.c b/ext/opcache/zend_shared_alloc.c index 177cbcc46ff..e4e44c35be0 100644 --- a/ext/opcache/zend_shared_alloc.c +++ b/ext/opcache/zend_shared_alloc.c @@ -594,6 +594,25 @@ void zend_accel_shared_protect(int mode) for (i = 0; i < ZSMMG(shared_segments_count); i++) { mprotect(ZSMMG(shared_segments)[i]->p, ZSMMG(shared_segments)[i]->size, mode); } +#elif defined(ZEND_WIN32) + int i; + + if (!smm_shared_globals) { + return; + } + + if (mode) { + mode = PAGE_READONLY; + } else { + mode = PAGE_READWRITE; + } + + for (i = 0; i < ZSMMG(shared_segments_count); i++) { + DWORD oldProtect; + if (!VirtualProtect(ZSMMG(shared_segments)[i]->p, ZSMMG(shared_segments)[i]->size, mode, &oldProtect)) { + zend_accel_error(ACCEL_LOG_ERROR, "Failed to protect memory"); + } + } #endif }