diff --git a/typo3/sysext/core/Classes/Resource/ResourceStorage.php b/typo3/sysext/core/Classes/Resource/ResourceStorage.php
index 0d34b943f8f1bb441cf23f551f86e059cd5b77a4..56c8cb30be833927a984800bee4163259329438f 100644
--- a/typo3/sysext/core/Classes/Resource/ResourceStorage.php
+++ b/typo3/sysext/core/Classes/Resource/ResourceStorage.php
@@ -1697,14 +1697,20 @@ class ResourceStorage implements ResourceStorageInterface
         $deleted = true;
 
         if ($this->driver->fileExists($fileObject->getIdentifier())) {
-            $recyclerFolder = $this->getNearestRecyclerFolder($fileObject);
+            // Disable permission check to find nearest recycler and move file without errors
+            $currentPermissions = $this->evaluatePermissions;
+            $this->evaluatePermissions = false;
 
+            $recyclerFolder = $this->getNearestRecyclerFolder($fileObject);
             if ($recyclerFolder === null) {
                 $result = $this->driver->deleteFile($fileObject->getIdentifier());
             } else {
                 $result = $this->moveFile($fileObject, $recyclerFolder);
                 $deleted = false;
             }
+
+            $this->evaluatePermissions = $currentPermissions;
+
             if (!$result) {
                 throw new Exception\FileOperationErrorException('Deleting the file "' . $fileObject->getIdentifier() . '\' failed.', 1329831691);
             }
@@ -1809,12 +1815,18 @@ class ResourceStorage implements ResourceStorageInterface
             } else {
                 $tempPath = $file->getForLocalProcessing();
                 $newIdentifier = $this->driver->addFile($tempPath, $targetFolder->getIdentifier(), $sanitizedTargetFileName);
-                $recyclerFolder = $this->getNearestRecyclerFolder($file);
+
+                // Disable permission check to find nearest recycler and move file without errors
+                $currentPermissions = $sourceStorage->evaluatePermissions;
+                $sourceStorage->evaluatePermissions = false;
+
+                $recyclerFolder = $sourceStorage->getNearestRecyclerFolder($file);
                 if ($recyclerFolder === null) {
                     $sourceStorage->driver->deleteFile($file->getIdentifier());
                 } else {
-                    $this->moveFile($file, $recyclerFolder);
+                    $sourceStorage->moveFile($file, $recyclerFolder);
                 }
+                $sourceStorage->evaluatePermissions = $currentPermissions;
                 if ($file instanceof File) {
                     $file->updateProperties(['storage' => $this->getUid(), 'identifier' => $newIdentifier]);
                 }
@@ -3028,12 +3040,9 @@ class ResourceStorage implements ResourceStorageInterface
         }
 
         $recyclerFolder = null;
-        $rootFolder = $this->getRootLevelFolder(false);
-        $folder = null;
+        $folder = $file->getParentFolder();
 
         do {
-            $folder = $folder !== null ? $folder->getParentFolder() : $file->getParentFolder();
-
             if ($folder->getRole() === FolderInterface::ROLE_RECYCLER) {
                 break;
             }
@@ -3044,7 +3053,11 @@ class ResourceStorage implements ResourceStorageInterface
                     break;
                 }
             }
-        } while ($recyclerFolder === null && $folder->getCombinedIdentifier() !== $rootFolder->getCombinedIdentifier());
+
+            $parentFolder = $folder->getParentFolder();
+            $isFolderLoop = $folder->getIdentifier() === $parentFolder->getIdentifier();
+            $folder = $parentFolder;
+        } while ($recyclerFolder === null && !$isFolderLoop);
 
         return $recyclerFolder;
     }