From f31d7ca85e400b85c06adb8db24c573dc1d98dbb Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Wed, 10 Apr 2019 14:55:15 +0200 Subject: [PATCH] Fix phar:// include handling with file cache --- ext/opcache/zend_file_cache.c | 16 ++++++- ext/phar/tests/024-opcache-win32.phpt | 61 +++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 ext/phar/tests/024-opcache-win32.phpt diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c index 6261e826d2..c00f1534dc 100644 --- a/ext/opcache/zend_file_cache.c +++ b/ext/opcache/zend_file_cache.c @@ -775,7 +775,21 @@ static char *zend_file_cache_get_bin_file_path(zend_string *script_path) filename[len] = '\\'; memcpy(filename + len + 1, ZCG(system_id), 32); - if (ZSTR_LEN(script_path) >= 2 && ':' == ZSTR_VAL(script_path)[1]) { + + if (ZSTR_LEN(script_path) >= 7 && ':' == ZSTR_VAL(script_path)[4] && '/' == ZSTR_VAL(script_path)[5] && '/' == ZSTR_VAL(script_path)[6]) { + /* phar:// or file:// */ + *(filename + len + 33) = '\\'; + memcpy(filename + len + 34, ZSTR_VAL(script_path), 4); + if (ZSTR_LEN(script_path) - 7 >= 2 && ':' == ZSTR_VAL(script_path)[8]) { + *(filename + len + 38) = '\\'; + *(filename + len + 39) = ZSTR_VAL(script_path)[7]; + memcpy(filename + len + 40, ZSTR_VAL(script_path) + 9, ZSTR_LEN(script_path) - 9); + memcpy(filename + len + 40 + ZSTR_LEN(script_path) - 9, SUFFIX, sizeof(SUFFIX)); + } else { + memcpy(filename + len + 38, ZSTR_VAL(script_path) + 7, ZSTR_LEN(script_path) - 7); + memcpy(filename + len + 38 + ZSTR_LEN(script_path) - 7, SUFFIX, sizeof(SUFFIX)); + } + } else if (ZSTR_LEN(script_path) >= 2 && ':' == ZSTR_VAL(script_path)[1]) { /* local fs */ *(filename + len + 33) = '\\'; *(filename + len + 34) = ZSTR_VAL(script_path)[0]; diff --git a/ext/phar/tests/024-opcache-win32.phpt b/ext/phar/tests/024-opcache-win32.phpt new file mode 100644 index 0000000000..81eedd9668 --- /dev/null +++ b/ext/phar/tests/024-opcache-win32.phpt @@ -0,0 +1,61 @@ +--TEST-- +Phar: phar:// include with Opcache +--SKIPIF-- + + + + +--INI-- +phar.require_hash=0 +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_cache={PWD}/024-file_cache +opcache.memory_consumption=64 +opcache.interned_strings_buffer=8 +opcache.max_accelerated_files=4000 +opcache.jit_buffer_size=6M +opcache.revalidate_freq=60 +opcache.fast_shutdown=1 +--FILE-- +"; + +$files = array(); +$files['a.php'] = ''; +$files['b.php'] = ''; +$files['b/c.php'] = ''; + +include 'files/phar_test.inc'; + +include $pname . '/a.php'; +include $pname . '/b.php'; +include $pname . '/b/c.php'; + +$cache_dir = ini_get("opcache.file_cache"); +if (is_dir($cache_dir)) { + $it = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($cache_dir, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST + ); + foreach ($it as $fi) { + $fn = ($fi->isDir() ? 'rmdir' : 'unlink'); + $fn($fi->getRealPath()); + } + + rmdir($cache_dir); +} + +?> +===DONE=== +--CLEAN-- + +--EXPECT-- +This is a +This is b +This is b/c +===DONE=== -- 2.49.0