From c4efc41c4bc5659176d2e5545e94fd88bffc789e Mon Sep 17 00:00:00 2001 From: Meik Date: Thu, 16 Jul 2026 13:34:53 +0200 Subject: [PATCH] Prevent NTFS traverse ensure loop --- LiamNtfs/C4IT_IAM_SET/DataArea_FileSystem.cs | 29 ++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/LiamNtfs/C4IT_IAM_SET/DataArea_FileSystem.cs b/LiamNtfs/C4IT_IAM_SET/DataArea_FileSystem.cs index 71a13a4..f56ec5a 100644 --- a/LiamNtfs/C4IT_IAM_SET/DataArea_FileSystem.cs +++ b/LiamNtfs/C4IT_IAM_SET/DataArea_FileSystem.cs @@ -677,6 +677,9 @@ namespace C4IT_IAM_SET GroupPrincipal traverseGroup = null; string traverseGroupName = null; + var visitedTraverseStates = new HashSet(StringComparer.OrdinalIgnoreCase); + var traverseIterationCount = 0; + const int maxTraverseIterations = 256; // Überprüfen, ob createTraverseGroupLvl initialisiert ist DefaultLogger.LogEntry(LogLevels.Debug, $"createTraverseGroupLvl: {createTraverseGroupLvl}"); @@ -697,6 +700,24 @@ namespace C4IT_IAM_SET break; } + traverseIterationCount++; + if (traverseIterationCount > maxTraverseIterations) + { + resultToken.resultErrorId = 30200; + resultToken.resultMessage = $"Traverse-Verarbeitung fuer '{newDir.FullName}' wurde nach {maxTraverseIterations} Iterationen abgebrochen."; + DefaultLogger.LogEntry(LogLevels.Error, resultToken.resultMessage); + return resultToken; + } + + var traverseState = $"{NormalizeDirectoryPath(parent.FullName)}|{currentTraverseLevel}|{defaultTraverseLoopIndex}"; + if (!visitedTraverseStates.Add(traverseState)) + { + resultToken.resultErrorId = 30200; + resultToken.resultMessage = $"Traverse-Verarbeitung fuer '{newDir.FullName}' wurde abgebrochen, weil der Pfad '{parent.FullName}' auf Ebene {currentTraverseLevel} erneut verarbeitet werden sollte."; + DefaultLogger.LogEntry(LogLevels.Error, resultToken.resultMessage); + return resultToken; + } + var canManageTraversePath = CanManageTraversePermissionsForPath ?? CanManagePermissionsForPath; if (canManageTraversePath != null && !canManageTraversePath(parent.FullName)) { @@ -981,7 +1002,9 @@ namespace C4IT_IAM_SET catch (Exception ex) { DefaultLogger.LogEntry(LogLevels.Error, $"Fehler beim Setzen der ACL: {ex.Message}"); - continue; + resultToken.resultErrorId = 30200; + resultToken.resultMessage = $"Fehler beim Setzen der Traverse-ACL auf '{parent.FullName}' fuer '{parentTraverseGroupName ?? newTraverseGroup.Name}': {ex.Message}"; + return resultToken; } } } @@ -1017,7 +1040,9 @@ namespace C4IT_IAM_SET catch (Exception ex) { DefaultLogger.LogEntry(LogLevels.Error, $"Fehler beim Sicherstellen der Traverse-ACL: {ex.Message}"); - continue; + resultToken.resultErrorId = 30200; + resultToken.resultMessage = $"Fehler beim Sicherstellen der Traverse-ACL auf '{parent.FullName}' fuer '{parentTraverseGroup.Name}': {ex.Message}"; + return resultToken; } }