Signed-off-by: Robin Appelman <robin@icewind.nl>tags/v26.0.0beta1
@@ -166,6 +166,9 @@ class Local extends \OC\Files\Storage\Common { | |||
public function stat($path) { | |||
$fullPath = $this->getSourcePath($path); | |||
clearstatcache(true, $fullPath); | |||
if (!file_exists($fullPath)) { | |||
return false; | |||
} | |||
$statResult = @stat($fullPath); | |||
if (PHP_INT_SIZE === 4 && $statResult && !$this->is_dir($path)) { | |||
$filesize = $this->filesize($path); | |||
@@ -388,11 +391,15 @@ class Local extends \OC\Files\Storage\Common { | |||
} | |||
public function fopen($path, $mode) { | |||
$sourcePath = $this->getSourcePath($path); | |||
if (!file_exists($sourcePath) && $mode === 'r') { | |||
return false; | |||
} | |||
$oldMask = umask($this->defUMask); | |||
if (($mode === 'w' || $mode === 'w+') && $this->unlinkOnTruncate) { | |||
$this->unlink($path); | |||
} | |||
$result = fopen($this->getSourcePath($path), $mode); | |||
$result = @fopen($sourcePath, $mode); | |||
umask($oldMask); | |||
return $result; | |||
} |
@@ -1001,7 +1001,17 @@ class View { | |||
$this->logger->info('Trying to open a file with a mode other than "r" or "w" can cause severe performance issues with some backends', ['app' => 'core']); | |||
} | |||
return $this->basicOperation('fopen', $path, $hooks, $mode); | |||
$handle = $this->basicOperation('fopen', $path, $hooks, $mode); | |||
if (!is_resource($handle) && $mode === 'r') { | |||
// trying to read a file that isn't on disk, check if the cache is out of sync and rescan if needed | |||
$mount = $this->getMount($path); | |||
$internalPath = $mount->getInternalPath($this->getAbsolutePath($path)); | |||
$storage = $mount->getStorage(); | |||
if ($storage->getCache()->inCache($internalPath) && !$storage->file_exists($path)) { | |||
$this->writeUpdate($storage, $internalPath); | |||
} | |||
} | |||
return $handle; | |||
} | |||
/** |