Skip to content

Conversation

@jakepetroules
Copy link
Contributor

GetBinaryType will return ERROR_BAD_EXE_FORMAT when querying an arm64 executable from an x86 process running on an ARM system. This change switches the implementation to use SHGetFileInfoW, which isn't subject to this quirk.

This also makes isExecutableFile behave more similarly to other platforms -- e.g. isExecutableFile already returns true for any file with the execute bit, even for an arm64 executable on an x86_64 macOS system (which it can't actually run). The spirit of the API is that the file is of an executable type, not necessarily that the running system is capable of executing it.

The practical consequence of fixing this bug is that queries like:

FileManager.default.isExecutableFile(atPath: "C:\\Windows\\system32\\cmd.exe")

will now correctly return true regardless of what architecture the binary is compiled for or what type of system it's running on.

Closes #860

@jakepetroules
Copy link
Contributor Author

@swift-ci test

…stems

GetBinaryType will return ERROR_BAD_EXE_FORMAT when querying an arm64 executable from an x86 process running on an ARM system. This change switches the implementation to use SHGetFileInfoW, which isn't subject to this quirk.

This also makes isExecutableFile behave more similarly to other platforms -- e.g. isExecutableFile already returns true for any file with the execute bit, even for an arm64 executable on an x86_64 macOS system (which it can't actually run). The spirit of the API is that the file is of an executable type, not necessarily that the running system is capable of executing it.

The practical consequence of fixing this bug is that queries like:

```swift
FileManager.default.isExecutableFile(atPath: "C:\\Windows\\system32\\cmd.exe")
```

will now correctly return true regardless of what architecture the binary is compiled for or what type of system it's running on.

Closes swiftlang#860
@jakepetroules
Copy link
Contributor Author

@swift-ci test

@jmschonfeld jmschonfeld merged commit c16e0d9 into swiftlang:main Apr 11, 2025
3 checks passed
@jakepetroules jakepetroules deleted the fix-isexecutablefile branch April 23, 2025 07:55
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.

FileManager.isExecutableFile fails for wow64 processes

3 participants