]> granicus.if.org Git - php/commitdiff
Fixed bug #74663 (Segfault with opcache.memory_protect and validate_timestamp)
authorXinchen Hui <laruence@gmail.com>
Sat, 27 May 2017 14:42:17 +0000 (22:42 +0800)
committerXinchen Hui <laruence@gmail.com>
Sat, 27 May 2017 14:42:27 +0000 (22:42 +0800)
NEWS
ext/opcache/ZendAccelerator.c
ext/opcache/ZendAccelerator.h
ext/opcache/tests/bug74663.phpt [new file with mode: 0644]
ext/opcache/zend_accelerator_module.c

diff --git a/NEWS b/NEWS
index 484e68435213d1d427e7e0855a15bcab5132e08c..419d8aad3b4769c4b797812b54302c34eb41cd0a 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,10 @@ PHP                                                                        NEWS
   . Fixed bug #74658 (Undefined constants in array properties result in broken
     properties). (Laruence)
 
+- Opcache:
+  . Fixed bug #74663 (Segfault with opcache.memory_protect and
+    validate_timestamp). (Laruence)
+
 - SPL:
   . Fixed bug #74478 (null coalescing operator failing with SplFixedArray).
     (jhdxr)
index 0b7c64bc9e5eae060b0f810021c8990ac18b0683..4c57e5c91e3157dbb2f6de6f4f263265ef6dc6ec 100644 (file)
@@ -957,6 +957,17 @@ int validate_timestamp_and_record(zend_persistent_script *persistent_script, zen
        }
 }
 
+int validate_timestamp_and_record_ex(zend_persistent_script *persistent_script, zend_file_handle *file_handle)
+{
+       int ret;
+
+       SHM_UNPROTECT();
+       ret = validate_timestamp_and_record(persistent_script, file_handle);
+       SHM_PROTECT();
+
+       return ret;
+}
+
 /* Instead of resolving full real path name each time we need to identify file,
  * we create a key that consist from requested file name, current working
  * directory, current include_path, etc */
index 738a82954fe49515ff94e33b803ba2db528927fe..8f2349a010e4f0a00520c094e98a14e83e30a9f8 100644 (file)
@@ -331,6 +331,7 @@ void zend_accel_schedule_restart(zend_accel_restart_reason reason);
 void zend_accel_schedule_restart_if_necessary(zend_accel_restart_reason reason);
 accel_time_t zend_get_file_handle_timestamp(zend_file_handle *file_handle, size_t *size);
 int  validate_timestamp_and_record(zend_persistent_script *persistent_script, zend_file_handle *file_handle);
+int  validate_timestamp_and_record_ex(zend_persistent_script *persistent_script, zend_file_handle *file_handle);
 int  zend_accel_invalidate(const char *filename, int filename_len, zend_bool force);
 int  zend_accel_script_optimize(zend_persistent_script *persistent_script);
 int  accelerator_shm_read_lock(void);
diff --git a/ext/opcache/tests/bug74663.phpt b/ext/opcache/tests/bug74663.phpt
new file mode 100644 (file)
index 0000000..32248b8
--- /dev/null
@@ -0,0 +1,25 @@
+--TEST--
+Bug #74663 (Segfault with opcache.memory_protect and validate_timestamp)
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.file_update_protection=0
+opcache.enable_file_override=1
+opcache.validate_timestamps=1
+opcache.revalidate_freq=0
+opcache.protect_memory=1
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+$file = __DIR__ . "/bug74663.inc";
+file_put_contents($file, "");
+include $file;
+
+var_dump(is_file($file));
+?>
+--CLEAN--
+<?php
+unlink(__DIR__ . "/bug74663.inc");
+--EXPECT--
+bool(true)
index 898a13c6db951fc4c5054cc9e226c4d708843344..6112027cd832e4fb85287d5397f9bc7caf23be11 100644 (file)
@@ -341,7 +341,7 @@ static int filename_is_in_cache(zend_string *filename)
                        handle.type = ZEND_HANDLE_FILENAME;
 
                        if (ZCG(accel_directives).validate_timestamps) {
-                               return validate_timestamp_and_record(persistent_script, &handle) == SUCCESS;
+                               return validate_timestamp_and_record_ex(persistent_script, &handle) == SUCCESS;
                        }
 
                        return 1;