prevent infinite recursion while getting storage from mount
This commit is contained in:
parent
58b810a547
commit
fa980af53c
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue