From 75a5e6e12b18a9f5b7b113cd7e2c9c56c204084d Mon Sep 17 00:00:00 2001
From: Robin McCorkell <rmccorkell@karoshi.org.uk>
Date: Sat, 7 Mar 2015 00:12:46 +0000
Subject: [PATCH] Fix mounting wrapped storages resulting in many-layered
 wrapping

This usually doesn't cause issues, but in unit tests sometimes a wrapped
storage is passed to Filesystem::mount() and gets rewrapped, hitting the
XDebug function nesting level limit when used.
---
 lib/private/files/mount/mountpoint.php |  7 ++++++-
 tests/lib/files/mount/mountpoint.php   | 21 +++++++++++++++++++++
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/lib/private/files/mount/mountpoint.php b/lib/private/files/mount/mountpoint.php
index 2871bbd908..5e4949aa9d 100644
--- a/lib/private/files/mount/mountpoint.php
+++ b/lib/private/files/mount/mountpoint.php
@@ -29,6 +29,7 @@ namespace OC\Files\Mount;
 use \OC\Files\Filesystem;
 use OC\Files\Storage\StorageFactory;
 use OC\Files\Storage\Storage;
+use OC\Files\Storage\Wrapper\Wrapper;
 use OCP\Files\Mount\IMountPoint;
 
 class MountPoint implements IMountPoint {
@@ -92,7 +93,11 @@ class MountPoint implements IMountPoint {
 		$this->mountPoint = $mountpoint;
 		if ($storage instanceof Storage) {
 			$this->class = get_class($storage);
-			$this->storage = $this->loader->wrap($this, $storage);
+			$this->storage = $storage;
+			// only wrap if not already wrapped
+			if (!($this->storage instanceof Wrapper)) {
+				$this->storage = $this->loader->wrap($this, $this->storage);
+			}
 		} else {
 			// Update old classes to new namespace
 			if (strpos($storage, 'OC_Filestorage_') !== false) {
diff --git a/tests/lib/files/mount/mountpoint.php b/tests/lib/files/mount/mountpoint.php
index 29610e6058..d758c1b8d4 100644
--- a/tests/lib/files/mount/mountpoint.php
+++ b/tests/lib/files/mount/mountpoint.php
@@ -70,4 +70,25 @@ class MountPoint extends \Test\TestCase {
 		// storage wrapper never called
 		$this->assertFalse($called);
 	}
+
+	public function testWrappedStorage() {
+		$storage = $this->getMockBuilder('\OC\Files\Storage\Wrapper\Wrapper')
+			->disableOriginalConstructor()
+			->getMock();
+
+		$loader = $this->getMock('\OCP\Files\Storage\IStorageFactory');
+		$loader->expects($this->never())
+			->method('getInstance');
+		$loader->expects($this->never())
+			->method('wrap');
+
+		$mountPoint = new \OC\Files\Mount\MountPoint(
+			$storage,
+			'/mountpoint',
+			null,
+			$loader
+		);
+
+		$this->assertEquals($storage, $mountPoint->getStorage());
+	}
 }
-- 
GitLab