summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-03-25 15:23:11 +0100
committerNikita Popov <nikita.ppv@gmail.com>2019-04-10 15:31:18 +0200
commiteb8c07fe2f081a5e270f19c329180469d66142bb (patch)
tree84f602f2ffe1fa510ce9513437373d52efd51de7 /ext
parentdb7aba538d2813fca7c69fdb8c004e8df06173ed (diff)
downloadphp-git-eb8c07fe2f081a5e270f19c329180469d66142bb.tar.gz
Support VirtualProtect for opcache.protect_memory
Don't enable this on AppVeyor yet, as there is still an open issue in phar.
Diffstat (limited to 'ext')
-rw-r--r--ext/opcache/ZendAccelerator.c4
-rw-r--r--ext/opcache/zend_shared_alloc.c19
2 files changed, 23 insertions, 0 deletions
diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c
index 0bdee2bfe0..56651f2d4c 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 177cbcc46f..e4e44c35be 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
}