]> granicus.if.org Git - php/commitdiff
Fix #78189: file cache strips last character of uname hash
authorChristoph M. Becker <cmbecker69@gmx.de>
Thu, 20 Jun 2019 15:53:10 +0000 (17:53 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Thu, 20 Jun 2019 15:58:32 +0000 (17:58 +0200)
We must not forget to increase `len` by one to cater to the directory
separator.

NEWS
ext/opcache/tests/bug78189.phpt [new file with mode: 0644]
ext/opcache/zend_file_cache.c

diff --git a/NEWS b/NEWS
index 104a71dbfb210b29cd44cbd8bf5cbf37a7864464..ae34c8f442a794e81b9325d428fa6f53072e7ac5 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -9,6 +9,9 @@ PHP                                                                        NEWS
 - Date:
   . Fixed #69044 (discrepency between time and microtime). (krakjoe)
 
+- OPcache:
+  . Fixed #78189 (file cache strips last character of uname hash). (cmb)
+
 27 Jun 2019, PHP 7.2.20
 
 - Core:
diff --git a/ext/opcache/tests/bug78189.phpt b/ext/opcache/tests/bug78189.phpt
new file mode 100644 (file)
index 0000000..49891c8
--- /dev/null
@@ -0,0 +1,22 @@
+--TEST--
+Bug #78189 (file cache strips last character of uname hash)
+--SKIPIF--
+<?php
+if (!extension_loaded('Zend OPcache')) die('skip opcache extension not available');
+if (substr(PHP_OS, 0, 3) !== 'WIN') die('skip this test is for Windows platforms only');
+?>
+--INI--
+opcache.enable_cli=1
+opcache.optimization_level=-1
+opcache.file_cache={TMP}
+opcache.file_cache_only=1
+--FILE--
+<?php
+$tmpdir = sys_get_temp_dir();
+$pattern = $tmpdir . '/*/*/' . str_replace(':', '', __DIR__) . '/bug78189.php.bin';
+foreach (glob($pattern) as $filename) {
+    var_dump(preg_match('~/[0-9a-f]{32}/~', substr($filename, strlen($tmpdir), 34)));
+}
+?>
+--EXPECT--
+int(1)
index 20f21d6a83f9cd91f5358dfde18b0f47f272eae9..39de839e47e814ad8b44424606375f39819116c7 100644 (file)
@@ -775,7 +775,7 @@ static char *zend_file_cache_get_bin_file_path(zend_string *script_path)
        memcpy(filename, ZCG(accel_directives).file_cache, len);
        filename[len] = '\\';
        memcpy(filename + 1 + len, md5uname, 32);
-       len += 32;
+       len += 1 + 32;
        filename[len] = '\\';
 
        memcpy(filename + len + 1, ZCG(system_id), 32);