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.
This fixes a soundness hole in
ComObject
. The soundness hole is that we should never allow safe Rust code to hold an owned instance ofMyApp_Impl
objects (implementations of COM objects) because those objects contain reference counts and provide safely-callable methods that adjust those reference counts. If Rust code holds an owned instance of such a type, then we don't control its lifetime; it may be placed on the stack, in astatic
, etc. and we have no control over that.This PR closes the soundness hole by providing only one way to get access to any
MyApp_Impl
type -- these types are immediately placed into a heap allocation and the only way to access them is through aComObject
reference.A few other minor improvements:
ComObject::as_reference()
and friends now work withIInspectable
.&'static
instead of*const
.From
implementations to use safeComObject
code.ComObject
by callingfoo.into_object()
.