diff options
author | Roland Tapken <roland@bitarbeiter.net> | 2018-02-09 17:40:00 +0100 |
---|---|---|
committer | Robin Appelman <robin@icewind.nl> | 2018-05-25 15:00:35 +0200 |
commit | e8868c2148163fbf152c70e607e73cbac829a58a (patch) | |
tree | e03637068600ca7bc9ab2eacbd9a8ad46a4e23f9 /apps/files_external | |
parent | d8e3c3cb222dd450246fd1ac1d4dcb47ff179b7d (diff) | |
download | nextcloud-server-e8868c2148163fbf152c70e607e73cbac829a58a.tar.gz nextcloud-server-e8868c2148163fbf152c70e607e73cbac829a58a.zip |
Make SMB module more fault-tolerant
Ignore unavailable files when fetching the share's mtime
or reading directory listings. This can happen on servers using a
distributed file system (DFS) with unavailable destinations, for example
when the remote server is offline.
Signed-off-by: Roland Tapken <roland@bitarbeiter.net>
Diffstat (limited to 'apps/files_external')
-rw-r--r-- | apps/files_external/lib/Lib/Storage/SMB.php | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/apps/files_external/lib/Lib/Storage/SMB.php b/apps/files_external/lib/Lib/Storage/SMB.php index d8bbe8c4718..c9828606ffb 100644 --- a/apps/files_external/lib/Lib/Storage/SMB.php +++ b/apps/files_external/lib/Lib/Storage/SMB.php @@ -156,7 +156,13 @@ class SMB extends Common implements INotifyStorage { $this->statCache[$path . '/' . $file->getName()] = $file; } return array_filter($files, function (IFileInfo $file) { - return !$file->isHidden(); + try { + return !$file->isHidden(); + } catch (ForbiddenException $e) { + return false; + } catch (NotFoundException $e) { + return false; + } }); } catch (ConnectException $e) { throw new StorageNotAvailableException($e->getMessage(), $e->getCode(), $e); @@ -230,8 +236,12 @@ class SMB extends Common implements INotifyStorage { $highestMTime = 0; $files = $this->share->dir($this->root); foreach ($files as $fileInfo) { - if ($fileInfo->getMTime() > $highestMTime) { - $highestMTime = $fileInfo->getMTime(); + try { + if ($fileInfo->getMTime() > $highestMTime) { + $highestMTime = $fileInfo->getMTime(); + } + } catch (NotFoundException $e) { + // Ignore this, can happen on unavailable DFS shares } } return $highestMTime; |