com php-src: Fixed reavlidate_path=1 behavior to av oid caching of symlinks values.: NEWS ext/opcac he/ZendAccelerator.c
ext/opcache/tests/revalidate_path_ 01.phpt
| From: | Dmitry Stogov | Date: | Wed, 18 Dec 2013 15:19:53 +0000 |
| Subject: | com php-src: Fixed reavlidate_path=1 behavior to av oid caching of symlinks values.: NEWS ext/opcac he/ZendAccelerator.c ext/opcache/tests/revalidate_path_ 01.phpt |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-74503@lists.php.net to get a copy of this message | ||
Commit: 16e95d91378591042c1bf4bd40dead3ef9ae975a
Author: Dmitry Stogov <dmitry@zend.com> Wed, 18 Dec 2013 19:19:53 +0400
Parents: 5e5ecaea6e8f56479e591c2e0de7f0a3b7d0af11
Branches: PHP-5.5 PHP-5.6 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=16e95d91378591042c1bf4bd40dead3ef9ae975a
Log:
Fixed reavlidate_path=1 behavior to avoid caching of symlinks values.
Changed paths:
M NEWS
M ext/opcache/ZendAccelerator.c
A ext/opcache/tests/revalidate_path_01.phpt
Diff:
diff --git a/NEWS b/NEWS
index d02633d...b1a939b 100644
--- a/NEWS
+++ b/NEWS
@@ -34,6 +34,10 @@ PHP NEWS
- MySQLi:
. Fixed bug #65486 (mysqli_poll() is broken on win x64). (Anatol)
+- OPCache:
+ . Fixed reavlidate_path=1 behavior to avoid caching of symlinks values.
+ (Dmitry)
+
- SOAP
. Fixed bug #66112 (Use after free condition in SOAP extension).
(martin dot koegler at brz dot gv dot at)
diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c
index c0edf7e..be56235 100644
--- a/ext/opcache/ZendAccelerator.c
+++ b/ext/opcache/ZendAccelerator.c
@@ -1153,8 +1153,9 @@ static zend_persistent_script
*cache_script_in_shared_memory(zend_persistent_scr
zend_persistent_script *existing_persistent_script = (zend_persistent_script *)bucket->data;
if (!existing_persistent_script->corrupted) {
- if (!ZCG(accel_directives).validate_timestamps ||
- (new_persistent_script->timestamp == existing_persistent_script->timestamp)) {
+ if (!ZCG(accel_directives).revalidate_path &&
+ (!ZCG(accel_directives).validate_timestamps ||
+ (new_persistent_script->timestamp == existing_persistent_script->timestamp))) {
zend_accel_add_key(key, key_length, bucket TSRMLS_CC);
}
zend_shared_alloc_unlock(TSRMLS_C);
@@ -1195,7 +1196,7 @@ static zend_persistent_script
*cache_script_in_shared_memory(zend_persistent_scr
/* store script structure in the hash table */
bucket = zend_accel_hash_update(&ZCSG(hash), new_persistent_script->full_path,
new_persistent_script->full_path_len + 1, 0, new_persistent_script);
- if (bucket &&
+ if (bucket && !ZCG(accel_directives).revalidate_path &&
/* key may contain non-persistent PHAR aliases (see issues #115 and #149) */
memcmp(key, "phar://", sizeof("phar://") - 1) != 0 &&
(new_persistent_script->full_path_len != key_length ||
diff --git a/ext/opcache/tests/revalidate_path_01.phpt b/ext/opcache/tests/revalidate_path_01.phpt
new file mode 100644
index 0000000..cf2ac0d
--- /dev/null
+++ b/ext/opcache/tests/revalidate_path_01.phpt
@@ -0,0 +1,61 @@
+--TEST--
+revalidate_path 01: OPCache must cache only resolved real paths when revalidate_path is set
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.revalidate_path=1
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+<?php if (php_sapi_name() != "cli") die("skip CLI only"); ?>
+--FILE--
+<?php
+$dir = dirname(__FILE__);
+$dir1 = "$dir/test1";
+$dir2 = "$dir/test2";
+$link = "$dir/test";
+$file1 = "$dir1/index.php";
+$file2 = "$dir2/index.php";
+$main = "$dir/main.php";
+@mkdir($dir1);
+@mkdir($dir2);
+@file_put_contents($main, '<?php include(\'' . $link
.'/index.php\');');
+@file_put_contents($file1, "TEST 1\n");
+@file_put_contents($file2, "TEST 2\n");
+while (filemtime($file1) != filemtime($file2)) {
+ touch($file1);
+ touch($file2);
+}
+@unlink($link);
+@symlink($dir1, $link);
+
+include "php_cli_server.inc";
+//php_cli_server_start('-d opcache.enable=1 -d opcache.enable_cli=1 -d
opcache.revalidate_path=1');
+php_cli_server_start('-d opcache.enable=1 -d opcache.enable_cli=1 -d opcache.revalidate_path=1
-d opcache.file_update_protection=0 -d realpath_cache_size=0');
+echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS .
'/main.php');
+echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS .
'/main.php');
+@unlink($link);
+@symlink($dir2, $link);
+echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS .
'/main.php');
+echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS .
'/main.php');
+?>
+--CLEAN--
+<?php
+$dir = dirname(__FILE__);
+$dir1 = "$dir/test1";
+$dir2 = "$dir/test2";
+$link = "$dir/test";
+$file1 = "$dir1/index.php";
+$file2 = "$dir2/index.php";
+$main = "$dir/main.php";
+@unlink($main);
+@unlink($link);
+@unlink($file1);
+@unlink($file2);
+@rmdir($dir1);
+@rmdir($dir2);
+?>
+--EXPECT--
+TEST 1
+TEST 1
+TEST 2
+TEST 2