Prevent NTFS traverse ensure loop
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user