diff options
author | Dmitry Stogov <dmitry@zend.com> | 2013-12-18 19:19:53 +0400 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2013-12-18 19:19:53 +0400 |
commit | 16e95d91378591042c1bf4bd40dead3ef9ae975a (patch) | |
tree | 65ee746f5a9f833b93fb66e56207c8782b9eabae | |
parent | 5e5ecaea6e8f56479e591c2e0de7f0a3b7d0af11 (diff) | |
download | php-git-16e95d91378591042c1bf4bd40dead3ef9ae975a.tar.gz |
Fixed reavlidate_path=1 behavior to avoid caching of symlinks values.
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | ext/opcache/ZendAccelerator.c | 7 | ||||
-rw-r--r-- | ext/opcache/tests/revalidate_path_01.phpt | 61 |
3 files changed, 69 insertions, 3 deletions
@@ -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 c0edf7e477..be56235929 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 0000000000..cf2ac0d829 --- /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 |