diff options
author | Varun Patil <varunpatil@ucla.edu> | 2024-03-25 14:12:36 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-25 14:12:36 -0700 |
commit | 024f689c97beca74f64db8d25fe82dcb9ef8441d (patch) | |
tree | c1b44517f27b2d91cadce4336436684503fee9f5 | |
parent | 7d51b6fff5d5c025d0db5ae21012f7f15b7a568c (diff) | |
parent | 158558763d5508bb3912a6b9dde3f3ad47c7c9ad (diff) | |
download | nextcloud-server-024f689c97beca74f64db8d25fe82dcb9ef8441d.tar.gz nextcloud-server-024f689c97beca74f64db8d25fe82dcb9ef8441d.zip |
Merge pull request #44230 from nextcloud/varun/config-read
config: fix correctness issues in reading
-rw-r--r-- | lib/private/Config.php | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/lib/private/Config.php b/lib/private/Config.php index 3ea822101df..803ce859de4 100644 --- a/lib/private/Config.php +++ b/lib/private/Config.php @@ -215,13 +215,24 @@ class Config { // Include file and merge config foreach ($configFiles as $file) { - $fileExistsAndIsReadable = file_exists($file) && is_readable($file); - $filePointer = $fileExistsAndIsReadable ? fopen($file, 'r') : false; - if ($file === $this->configFilePath && - $filePointer === false) { - // Opening the main config might not be possible, e.g. if the wrong - // permissions are set (likely on a new installation) - continue; + unset($CONFIG); + + // Invalidate opcache (only if the timestamp changed) + if (function_exists('opcache_invalidate')) { + opcache_invalidate($file, false); + } + + $filePointer = @fopen($file, 'r'); + if ($filePointer === false) { + // e.g. wrong permissions are set + if ($file === $this->configFilePath) { + // opening the main config file might not be possible + // (likely on a new installation) + continue; + } + + http_response_code(500); + die(sprintf('FATAL: Could not open the config file %s', $file)); } // Try to acquire a file lock @@ -229,8 +240,14 @@ class Config { throw new \Exception(sprintf('Could not acquire a shared lock on the config file %s', $file)); } - unset($CONFIG); - include $file; + try { + include $file; + } finally { + // Close the file pointer and release the lock + flock($filePointer, LOCK_UN); + fclose($filePointer); + } + if (!defined('PHPUNIT_RUN') && headers_sent()) { // syntax issues in the config file like leading spaces causing PHP to send output $errorMessage = sprintf('Config file has leading content, please remove everything before "<?php" in %s', basename($file)); @@ -242,10 +259,6 @@ class Config { if (isset($CONFIG) && is_array($CONFIG)) { $this->cache = array_merge($this->cache, $CONFIG); } - - // Close the file pointer and release the lock - flock($filePointer, LOCK_UN); - fclose($filePointer); } $this->envCache = getenv(); |