summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Appelman <robin@icewind.nl>2016-08-22 15:12:39 +0200
committerRobin Appelman <robin@icewind.nl>2016-08-23 14:52:18 +0200
commita0c2342c20d874a87335a3e1c21bbfa05a71a776 (patch)
treede17cd95db017e85e1a25f4a327beb045569392e
parent1e7c108bff45dfa5081fe6c5ec6115fe8c8d699a (diff)
downloadnextcloud-server-a0c2342c20d874a87335a3e1c21bbfa05a71a776.tar.gz
nextcloud-server-a0c2342c20d874a87335a3e1c21bbfa05a71a776.zip
prevent infinite recursion while getting storage from mount
-rw-r--r--apps/files_sharing/lib/sharedstorage.php4
-rw-r--r--lib/private/Files/Mount/MountPoint.php18
-rw-r--r--tests/lib/Files/Mount/MountPointTest.php8
3 files changed, 18 insertions, 12 deletions
diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php
index b67c9c5efb4..6dec020982e 100644
--- a/apps/files_sharing/lib/sharedstorage.php
+++ b/apps/files_sharing/lib/sharedstorage.php
@@ -401,6 +401,10 @@ class Shared extends \OC\Files\Storage\Wrapper\Jail implements ISharedStorage {
// shares do not participate in availability logic
}
+ public function getSourceStorage() {
+ return $this->getWrapperStorage();
+ }
+
public function getWrapperStorage() {
$this->init();
return $this->storage;
diff --git a/lib/private/Files/Mount/MountPoint.php b/lib/private/Files/Mount/MountPoint.php
index 8b8f0574ae0..4aef340149c 100644
--- a/lib/private/Files/Mount/MountPoint.php
+++ b/lib/private/Files/Mount/MountPoint.php
@@ -70,7 +70,7 @@ class MountPoint implements IMountPoint {
*/
private $invalidStorage = false;
- /** @var int|null */
+ /** @var int|null */
protected $mountId;
/**
@@ -132,18 +132,20 @@ class MountPoint implements IMountPoint {
/**
* create the storage that is mounted
- *
- * @return \OC\Files\Storage\Storage
*/
private function createStorage() {
if ($this->invalidStorage) {
- return null;
+ return;
}
if (class_exists($this->class)) {
try {
- return $this->loader->getInstance($this, $this->class, $this->arguments);
+ $class = $this->class;
+ // prevent recursion by setting the storage before applying wrappers
+ $this->storage = new $class($this->arguments);
+ $this->storage = $this->loader->wrap($this, $this->storage);
} catch (\Exception $exception) {
+ $this->storage = null;
$this->invalidStorage = true;
if ($this->mountPoint === '/') {
// the root storage could not be initialized, show the user!
@@ -151,12 +153,12 @@ class MountPoint implements IMountPoint {
} else {
\OCP\Util::writeLog('core', $exception->getMessage(), \OCP\Util::ERROR);
}
- return null;
+ return;
}
} else {
\OCP\Util::writeLog('core', 'storage backend ' . $this->class . ' not found', \OCP\Util::ERROR);
$this->invalidStorage = true;
- return null;
+ return;
}
}
@@ -165,7 +167,7 @@ class MountPoint implements IMountPoint {
*/
public function getStorage() {
if (is_null($this->storage)) {
- $this->storage = $this->createStorage();
+ $this->createStorage();
}
return $this->storage;
}
diff --git a/tests/lib/Files/Mount/MountPointTest.php b/tests/lib/Files/Mount/MountPointTest.php
index 392f10c7170..799f441a1ab 100644
--- a/tests/lib/Files/Mount/MountPointTest.php
+++ b/tests/lib/Files/Mount/MountPointTest.php
@@ -16,9 +16,9 @@ class MountPointTest extends \Test\TestCase {
->method('getId')
->will($this->returnValue(123));
- $loader = $this->getMock('\OCP\Files\Storage\IStorageFactory');
+ $loader = $this->getMock('\OC\Files\Storage\StorageFactory');
$loader->expects($this->once())
- ->method('getInstance')
+ ->method('wrap')
->will($this->returnValue($storage));
$mountPoint = new \OC\Files\Mount\MountPoint(
@@ -38,9 +38,9 @@ class MountPointTest extends \Test\TestCase {
}
public function testInvalidStorage() {
- $loader = $this->getMock('\OCP\Files\Storage\IStorageFactory');
+ $loader = $this->getMock('\OC\Files\Storage\StorageFactory');
$loader->expects($this->once())
- ->method('getInstance')
+ ->method('wrap')
->will($this->throwException(new \Exception('Test storage init exception')));
$called = false;