Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

avoid infinite loop caused by symbolic links #5813

Merged
merged 9 commits into from
Feb 23, 2024
27 changes: 25 additions & 2 deletions Sources/TuistSupport/Extensions/FileManager+Extras.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,23 @@ extension FileManager {
subdirectoriesResolvingSymbolicLinks(atNestedPath: nil, basePath: path)
}

private func subdirectoriesResolvingSymbolicLinks(atNestedPath nestedPath: String?, basePath: String) -> [String] {
private func subdirectoriesResolvingSymbolicLinks(
atNestedPath nestedPath: String?,
basePath: String,
visitedPaths: inout Set<String>
) -> [String] {
let currentLevelPath = nestedPath.map { NSString(string: basePath).appendingPathComponent($0) } ?? basePath
let resolvedCurrentLevelPath = resolvingSymbolicLinks(path: currentLevelPath)
let standardizedPath = NSString(string: resolvedCurrentLevelPath).standardizingPath

// Check if we've already visited this standardized path
guard !visitedPaths.contains(standardizedPath) else {
return []
}

// Mark this standardized path as visited
visitedPaths.insert(standardizedPath)

guard let resolvedSubpathsFromCurrentRoot = try? subpathsOfDirectory(atPath: resolvedCurrentLevelPath)
else {
return []
Expand All @@ -21,7 +35,11 @@ extension FileManager {
if isSymbolicLinkToDirectory(path: completeSubpath) {
resolvedSubpaths.append(relativeSubpath)
resolvedSubpaths.append(
contentsOf: subdirectoriesResolvingSymbolicLinks(atNestedPath: relativeSubpath, basePath: basePath)
contentsOf: subdirectoriesResolvingSymbolicLinks(
atNestedPath: relativeSubpath,
basePath: basePath,
visitedPaths: &visitedPaths
)
)
} else if isDirectory(path: completeSubpath) {
resolvedSubpaths.append(relativeSubpath)
Expand All @@ -31,6 +49,11 @@ extension FileManager {
return resolvedSubpaths
}

private func subdirectoriesResolvingSymbolicLinks(atNestedPath nestedPath: String?, basePath: String) -> [String] {
var visitedPaths: Set<String> = .init()
return subdirectoriesResolvingSymbolicLinks(atNestedPath: nestedPath, basePath: basePath, visitedPaths: &visitedPaths)
}

private func isSymbolicLinkToDirectory(path: String) -> Bool {
let pathResolvingSymbolicLinks = resolvingSymbolicLinks(path: path)
return pathResolvingSymbolicLinks != path && isDirectory(path: pathResolvingSymbolicLinks)
Expand Down
Loading