]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix(config): correctness issues in reading 44605/head
authorVarun Patil <varunpatil@ucla.edu>
Fri, 15 Mar 2024 17:24:17 +0000 (10:24 -0700)
committerEduardo Morales <emoral435@gmail.com>
Wed, 3 Apr 2024 13:19:20 +0000 (08:19 -0500)
Signed-off-by: Varun Patil <varunpatil@ucla.edu>
lib/private/Config.php

index 3ea822101df81a376ba8cd8c4de38d49f589ee88..803ce859de4344ec7e4a87e35b7b86744aee8126 100644 (file)
@@ -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();