From d7be404e6df4f25e731ce5ddd670d10002951403 Mon Sep 17 00:00:00 2001 From: Oladosu Ibrahim Date: Sun, 23 Aug 2026 04:09:08 +0000 Subject: [PATCH 1/2] Handle missing cached share mounts Fixes #62545 by making CleanupShareTarget tolerate a missing recipient mount-cache entry during repair. The repair now skips cache removal when no cached mount exists and continues updating the share target. Signed-off-by: Oladosu Ibrahim --- .../lib/Repair/CleanupShareTarget.php | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/apps/files_sharing/lib/Repair/CleanupShareTarget.php b/apps/files_sharing/lib/Repair/CleanupShareTarget.php index 340cc8840f04a..872fbb70930b0 100644 --- a/apps/files_sharing/lib/Repair/CleanupShareTarget.php +++ b/apps/files_sharing/lib/Repair/CleanupShareTarget.php @@ -118,16 +118,18 @@ public function run(IOutput $output) { $oldMountPoint = "/{$recipient->getUID()}/files$oldTarget/"; $newMountPoint = "/{$recipient->getUID()}/files$newTarget/"; - /** @var ICachedMountInfo $mount */ - $mount = $userMounts[$oldMountPoint]; - $userMounts[$newMountPoint] = $mount; - unset($userMounts[$oldMountPoint]); - - $this->userMountCache->removeMount($oldMountPoint); - $this->userMountCache->addMount($recipient, $newMountPoint, new CacheEntry([ - 'fileid' => $mount->getRootId(), - 'storage' => $mount->getStorageId(), - ]), $mount->getMountProvider(), $mount->getMountId()); + /** @var ICachedMountInfo|null $mount */ + $mount = $userMounts[$oldMountPoint] ?? null; + if ($mount !== null) { + $userMounts[$newMountPoint] = $mount; + unset($userMounts[$oldMountPoint]); + + $this->userMountCache->removeMount($oldMountPoint); + $this->userMountCache->addMount($recipient, $newMountPoint, new CacheEntry([ + 'fileid' => $mount->getRootId(), + 'storage' => $mount->getStorageId(), + ]), $mount->getMountProvider(), $mount->getMountId()); + } } } catch (\Exception $e) { $msg = 'error cleaning up share target: ' . $e->getMessage(); From 5a4b3f4b180b8fb36e51d56fca8ab6a89a570aec Mon Sep 17 00:00:00 2001 From: Oladosu Ibrahim Date: Sun, 23 Aug 2026 04:10:21 +0000 Subject: [PATCH 2/2] Add missing share mount regression test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add focused coverage for repairing a share target when the recipient’s old mount-cache entry is missing, ensuring the repair completes without dereferencing a null mount. Signed-off-by: Oladosu Ibrahim --- .../tests/Repair/CleanupShareTargetTest.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apps/files_sharing/tests/Repair/CleanupShareTargetTest.php b/apps/files_sharing/tests/Repair/CleanupShareTargetTest.php index e781a8ec72ef2..ffc095196d36a 100644 --- a/apps/files_sharing/tests/Repair/CleanupShareTargetTest.php +++ b/apps/files_sharing/tests/Repair/CleanupShareTargetTest.php @@ -10,6 +10,7 @@ use OC\Migration\NullOutput; use OCA\Files_Sharing\Repair\CleanupShareTarget; use OCA\Files_Sharing\Tests\TestCase; +use OCP\Files\Config\IUserMountCache; use OCP\Files\NotFoundException; use OCP\Server; use OCP\Share\IShare; @@ -66,6 +67,17 @@ public function testBasicRepair() { $this->assertEquals(self::TEST_FOLDER_NAME, $share->getTarget()); } + public function testRepairWithoutCachedMount() { + $share = $this->createUserShare(self::TEST_FILES_SHARING_API_USER1, self::TEST_FOLDER_NAME . ' (2) (2) (2) (2)'); + $mountPoint = '/' . self::TEST_FILES_SHARING_API_USER2 . '/files' . $share->getTarget() . '/'; + Server::get(IUserMountCache::class)->removeMount($mountPoint); + + $this->cleanupShareTarget->run(new NullOutput()); + + $share = $this->shareManager->getShareById($share->getFullId()); + $this->assertEquals(self::TEST_FOLDER_NAME, $share->getTarget()); + } + public function testRepairConflictFile() { $share = $this->createUserShare(self::TEST_FILES_SHARING_API_USER1, self::TEST_FOLDER_NAME . ' (2) (2) (2) (2)');