[php-src] Issue #10117: php_admin_[flag|value] falsely applies config changes

From: Date: Fri, 16 Dec 2022 16:28:25 +0000
Subject: [php-src] Issue #10117: php_admin_[flag|value] falsely applies config changes
Groups: php.bugs 
Request: Send a blank email to php-bugs+get-243167@lists.php.net to get a copy of this message
Issue: https://github.com/php/php-src/issues/10117 Author: pavel-rossinsky ### Description ### Quick explanation of the problem. When using strace I noticed stat system calls for the files already in opcache, even though opcache.enable_file_override is set to 1. The system calls are triggered by is_file() being invoked from PHP. php_admin_flag[opcache.enable_file_override] = On is set in the pool config /etc/php/8.1/fpm/pool.d/www.conf var_dump(opcache_get_configuration()) when being invoked through an fpm process says: ``` ["opcache.enable_file_override"]=>   | bool(true) ``` phpinfo() says the same, enable_file_override is On. I suspect the actual value of the flag is Off. ### How to reproduce the issue. 1. Ensure that opcache is enabled and enable_file_override is disabled (disabled by default). 2. Apply the fpm pool settings for simplicity of testing: ``` pm = static pm.max_children = 1 ``` 3. Add three test scripts to the document root of apache server: test_opcache.php ```php <?php echo "test begin\n"; $file1 = 'include_1.php'; $file2 = 'include_2.php'; if (is_file($file1)) { include $file1; } if (is_file($file2)) { include $file2; } echo "test end\n"; ``` plus two more scripts in the same directory: include_1.php ```php <?php echo __FILE__ . "\n"; ``` include_2.php ```php <?php echo __FILE__ . "\n"; ``` 4. Invoke the test_opcache.php to warm up the opcache via curl request or browser. 5. Attach to the child fpm process using strace -p <pid> -e newfstatat,fstat,stat. 6. Invoke the test_opcache.php again. Expected strace output: ``` newfstatat(AT_FDCWD, "/", {st_mode=S_IFDIR|0755, st_size=4096, ...}, 0) = 0 newfstatat(AT_FDCWD, "include_1.php", {st_mode=S_IFREG|0644, st_size=29, ...}, 0) = 0 newfstatat(AT_FDCWD, "include_2.php", {st_mode=S_IFREG|0644, st_size=29, ...}, 0) = 0 ``` 7. Set php_admin_flag[opcache.enable_file_override] = On in the pool config and restart apache and fpm. 8. Check if the config value is changed via var_dump(opcache_get_configuration()). 9. Repeat steps 4, 5, and 6. The strace output won't change. 10. Set opcache.enable_file_override=1 in the php.ini file and repeat steps 4, 5, and 6. The output will change to ``` newfstatat(AT_FDCWD, "/", {st_mode=S_IFDIR|0755, st_size=4096, ...}, 0) = 0 ``` ### Conclusion The opcache.enable_file_override flag works only when it's set in the ini file. The worst thing is that setting the flag in the pool config gives a false positive result in opcache_get_configuration() and phpinfo(), which might be very misleading. ### PHP Version PHP 8.1.13 ### Operating System Ubuntu 18.04

« previous php.bugs (#243167) next »