Skip to content

Conversation

@jmschonfeld
Copy link
Contributor

Within Process, the launchPath here is equivalent to executableURL.path. Just before launching the process, we call .withCString(encodedAs: UTF16.self) to convert the invocation to UTF-16. However, now that URL is re-cored on swift-foundation's URL, Windows paths are represented following RFC8089 which contains a leading / before a drive letter. The various file system representation functions remove this preceding slash before calling to an SDK API, however Process did not do this resulting in a path such as /C:/Users/jmschonfeld/foo.exe being passed to CreateProcessW which failed to find the file. This standardizes the path to its file system representation before it is combined with the various arguments and converted to UTF-16 later.

This fixes a failure that occurred during a windows toolchain build where SwiftPM (using the new Foundation) was unable to invoke swiftc.exe due to this issue.


#if os(Windows)
var command: [String] = [launchPath]
var command: [String] = [try FileManager.default._fileSystemRepresentation(withPath: launchPath) { String(decodingCString: $0, as: UTF16.self) }]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does _fileSystemRepresentation need to/can be applied on other platforms as well (just to be consistent)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point, it doesn't have the same level of effect on other platforms but I'll add it for good measure

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants