Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #768
Fix GC hole where the whole
MarshalString
object gets moved and makes theHSTRING
reference invalidFix memory leak and possible memory corruption in exception handling in GetActivationFactory
The implementation of
WindowsCreateStringReference
takes the header buffer, fills it and then the returned handle is a pointer to the header buffer. It is thus absolutely essential that the header buffer is not moved while the HSTRING instance is alive. This is explicitly called out in the documentation:The code was storing the header buffer in unpinned GC memory so the GC was free to move it and it occasionally did so which caused accesses from native code into invalid memory.
Now the solution in the PR is not the most optimal one but it's one that is least disruptive and easy to review. From performance point of view it would make sense to use
ref struct
and rely on the stack being unmovable.