prevent infinite recursion while getting storage from mount

This commit is contained in:
Robin Appelman 2016-08-22 15:12:39 +02:00
parent 58b810a547
commit fa980af53c
3 changed files with 18 additions and 12 deletions

View File

@ -401,6 +401,10 @@ class Shared extends \OC\Files\Storage\Wrapper\Jail implements ISharedStorage {
// shares do not participate in availability logic // shares do not participate in availability logic
} }
public function getSourceStorage() {
return $this->getWrapperStorage();
}
public function getWrapperStorage() { public function getWrapperStorage() {
$this->init(); $this->init();
return $this->storage; return $this->storage;

View File

@ -70,7 +70,7 @@ class MountPoint implements IMountPoint {
*/ */
private $invalidStorage = false; private $invalidStorage = false;
/** @var int|null */ /** @var int|null */
protected $mountId; protected $mountId;
/** /**
@ -132,18 +132,20 @@ class MountPoint implements IMountPoint {
/** /**
* create the storage that is mounted * create the storage that is mounted
*
* @return \OC\Files\Storage\Storage
*/ */
private function createStorage() { private function createStorage() {
if ($this->invalidStorage) { if ($this->invalidStorage) {
return null; return;
} }
if (class_exists($this->class)) { if (class_exists($this->class)) {
try { 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) { } catch (\Exception $exception) {
$this->storage = null;
$this->invalidStorage = true; $this->invalidStorage = true;
if ($this->mountPoint === '/') { if ($this->mountPoint === '/') {
// the root storage could not be initialized, show the user! // the root storage could not be initialized, show the user!
@ -151,12 +153,12 @@ class MountPoint implements IMountPoint {
} else { } else {
\OCP\Util::writeLog('core', $exception->getMessage(), \OCP\Util::ERROR); \OCP\Util::writeLog('core', $exception->getMessage(), \OCP\Util::ERROR);
} }
return null; return;
} }
} else { } else {
\OCP\Util::writeLog('core', 'storage backend ' . $this->class . ' not found', \OCP\Util::ERROR); \OCP\Util::writeLog('core', 'storage backend ' . $this->class . ' not found', \OCP\Util::ERROR);
$this->invalidStorage = true; $this->invalidStorage = true;
return null; return;
} }
} }
@ -165,7 +167,7 @@ class MountPoint implements IMountPoint {
*/ */
public function getStorage() { public function getStorage() {
if (is_null($this->storage)) { if (is_null($this->storage)) {
$this->storage = $this->createStorage(); $this->createStorage();
} }
return $this->storage; return $this->storage;
} }

View File

@ -16,9 +16,9 @@ class MountPointTest extends \Test\TestCase {
->method('getId') ->method('getId')
->will($this->returnValue(123)); ->will($this->returnValue(123));
$loader = $this->getMock('\OCP\Files\Storage\IStorageFactory'); $loader = $this->getMock('\OC\Files\Storage\StorageFactory');
$loader->expects($this->once()) $loader->expects($this->once())
->method('getInstance') ->method('wrap')
->will($this->returnValue($storage)); ->will($this->returnValue($storage));
$mountPoint = new \OC\Files\Mount\MountPoint( $mountPoint = new \OC\Files\Mount\MountPoint(
@ -38,9 +38,9 @@ class MountPointTest extends \Test\TestCase {
} }
public function testInvalidStorage() { public function testInvalidStorage() {
$loader = $this->getMock('\OCP\Files\Storage\IStorageFactory'); $loader = $this->getMock('\OC\Files\Storage\StorageFactory');
$loader->expects($this->once()) $loader->expects($this->once())
->method('getInstance') ->method('wrap')
->will($this->throwException(new \Exception('Test storage init exception'))); ->will($this->throwException(new \Exception('Test storage init exception')));
$called = false; $called = false;