From 34451526f80e21946c092bd61f531f8b302c1729 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Wed, 29 May 2024 08:16:06 -0700 Subject: [PATCH 1/2] FoundationEssentials: correct path canonicalisation handling on Windows Strip the extended path prefix for bypassing the Win32 API layer. This is guaranteed to be prefixed on strings as per the documentation. --- Sources/FoundationEssentials/String/String+Path.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Sources/FoundationEssentials/String/String+Path.swift b/Sources/FoundationEssentials/String/String+Path.swift index c629e40d2..b37d8ce31 100644 --- a/Sources/FoundationEssentials/String/String+Path.swift +++ b/Sources/FoundationEssentials/String/String+Path.swift @@ -665,7 +665,9 @@ extension String { guard GetFinalPathNameByHandleW(hFile, $0.baseAddress, dwLength, VOLUME_NAME_DOS) == dwLength - 1 else { return nil } - return String(decodingCString: $0.baseAddress!, as: UTF16.self) + + // When using `VOLUME_NAME_DOS`, the returned path uses `\\?\`. + return String(String(decodingCString: $0.baseAddress!.advanced(by: 4), as: UTF16.self)) } } #else From 35703d84eab73ba16400f9e0c5eb185d8ad1404c Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Thu, 30 May 2024 11:48:09 -0700 Subject: [PATCH 2/2] Update Sources/FoundationEssentials/String/String+Path.swift Co-authored-by: Jeremy Schonfeld <1004103+jmschonfeld@users.noreply.github.com> --- Sources/FoundationEssentials/String/String+Path.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/FoundationEssentials/String/String+Path.swift b/Sources/FoundationEssentials/String/String+Path.swift index b37d8ce31..651c6127e 100644 --- a/Sources/FoundationEssentials/String/String+Path.swift +++ b/Sources/FoundationEssentials/String/String+Path.swift @@ -667,7 +667,7 @@ extension String { } // When using `VOLUME_NAME_DOS`, the returned path uses `\\?\`. - return String(String(decodingCString: $0.baseAddress!.advanced(by: 4), as: UTF16.self)) + return String(decodingCString: $0.baseAddress!.advanced(by: 4), as: UTF16.self) } } #else