فهرست منبع

Merge pull request #44230 from nextcloud/varun/config-read

config: fix correctness issues in reading
Varun Patil 1 ماه پیش
والد
کامیت
024f689c97
1فایلهای تغییر یافته به همراه26 افزوده شده و 13 حذف شده
  1. 26 13
      lib/private/Config.php

+ 26 - 13
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();