Prevent NTFS traverse ensure loop

This commit is contained in:
Meik
2026-07-16 13:34:53 +02:00
parent daec5adfb5
commit c4efc41c4b

View File

@@ -677,6 +677,9 @@ namespace C4IT_IAM_SET
GroupPrincipal traverseGroup = null; GroupPrincipal traverseGroup = null;
string traverseGroupName = null; string traverseGroupName = null;
var visitedTraverseStates = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
var traverseIterationCount = 0;
const int maxTraverseIterations = 256;
// Überprüfen, ob createTraverseGroupLvl initialisiert ist // Überprüfen, ob createTraverseGroupLvl initialisiert ist
DefaultLogger.LogEntry(LogLevels.Debug, $"createTraverseGroupLvl: {createTraverseGroupLvl}"); DefaultLogger.LogEntry(LogLevels.Debug, $"createTraverseGroupLvl: {createTraverseGroupLvl}");
@@ -697,6 +700,24 @@ namespace C4IT_IAM_SET
break; 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; var canManageTraversePath = CanManageTraversePermissionsForPath ?? CanManagePermissionsForPath;
if (canManageTraversePath != null && !canManageTraversePath(parent.FullName)) if (canManageTraversePath != null && !canManageTraversePath(parent.FullName))
{ {
@@ -981,7 +1002,9 @@ namespace C4IT_IAM_SET
catch (Exception ex) catch (Exception ex)
{ {
DefaultLogger.LogEntry(LogLevels.Error, $"Fehler beim Setzen der ACL: {ex.Message}"); 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) catch (Exception ex)
{ {
DefaultLogger.LogEntry(LogLevels.Error, $"Fehler beim Sicherstellen der Traverse-ACL: {ex.Message}"); 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;
} }
} }