Support VirtualProtect for opcache.protect_memory
authorNikita Popov <nikita.ppv@gmail.com>
Mon, 25 Mar 2019 14:23:11 +0000 (15:23 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 10 Apr 2019 13:31:18 +0000 (15:31 +0200)
Don't enable this on AppVeyor yet, as there is still an open
issue in phar.

ext/opcache/ZendAccelerator.c
ext/opcache/zend_shared_alloc.c

index 0bdee2bfe03b07bd07090ccb893e980173b6da3d..56651f2d4c815a6fa8fa96cfcfcef6d8fa83b5d6 100644 (file)
@@ -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;
index 177cbcc46fffee7eb54711263a2cf3cd646ee816..e4e44c35be02a90282b56b24310bac5c278ea0c1 100644 (file)
@@ -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
 }