Prevent NTFS traverse ensure loop
This commit is contained in:
@@ -677,6 +677,9 @@ namespace C4IT_IAM_SET
|
||||
|
||||
GroupPrincipal traverseGroup = null;
|
||||
string traverseGroupName = null;
|
||||
var visitedTraverseStates = new HashSet<string>(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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user