Skip to content

[ClangImporter] Protect against re-entrant bridging header loading #27045

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

Merged
merged 1 commit into from
Sep 6, 2019

Conversation

jrose-apple
Copy link
Contributor

If, while loading a bridging header, we pick up a Clang module that claims to have an overlay Swift module, and that Swift module turns out to have a bridging header, we can end up reallocating the array of modules to process while we're looping over it. Be defensive against this occurrence.

This just fixes a crash; it does not at all solve the problem of this being broken in several ways:

  • Accidentally naming your module the same as a system module shadows the latter (if the system module is a Swift module) or makes your module into an overlay (if the system module is a Clang module).

  • Bridging headers are only officially supported on executable targets and unit tests, but this isn't really enforced.

  • Implicit inclusion of a bridging header when you import a Swift module is a hack to begin with, and a hack that worsens when the main module also has a bridging header. (All the bridging headers get folded together into the "same" module, which leads to more visibility than desired as well as cycles in the import graph.)

  • Combining all of these can result in some pretty bizarre behavior.

rdar://problem/54581756

If, while loading a bridging header, we pick up a Clang module that
claims to have an overlay Swift module, and that Swift module turns
out to have a bridging header, we can end up reallocating the array
of modules to process while we're looping over it. Be defensive
against this occurrence.

This just fixes a crash; it does not at all solve the problem of this
being broken in several ways:

- Accidentally naming your module the same as a system module shadows
  the latter (if the system module is a Swift module) or *makes your
  module into an overlay* (if the system module is a Clang module).

- Bridging headers are only officially supported on executable targets
  and unit tests, but this isn't really enforced.

- Implicit inclusion of a bridging header *when you import a Swift
  module* is a hack to begin with, and a hack that worsens when the
  main module also has a bridging header. (All the bridging headers
  get folded together into the "same" module, which leads to more
  visibility than desired as well as cycles in the import graph.)

- Combining all of these can result in some pretty bizarre behavior.

rdar://problem/54581756
@jrose-apple
Copy link
Contributor Author

@swift-ci Please test

@jrose-apple
Copy link
Contributor Author

@swift-ci Please test Windows

Copy link
Contributor

@harlanhaskins harlanhaskins left a comment

Choose a reason for hiding this comment

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

This looks like it was a nightmare to debug.

@jrose-apple
Copy link
Contributor Author

After discovering the cause (app target named the same as a system framework) I went and implemented a whole different thing (trying to avoid thinking the app module was the overlay for the system framework) and it didn't actually fix the crash. I'll throw up the PR for that too but it was kind of a mess and doesn't fix everything so I'm not sure it's worth it.

@jrose-apple
Copy link
Contributor Author

This is the force-push bug, I think.

@swift-ci Please test Windows

@jrose-apple jrose-apple merged commit e42dd5a into swiftlang:master Sep 6, 2019
@jrose-apple jrose-apple deleted the bridge-to-nowhere branch September 6, 2019 00:00
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