Repository navigation
fix: keep native references until their Java wrapper is created - #516
Merged
Merged
Conversation
JavaFactories::createOwning builds the wrapper from the smart pointer's get() and releases the reference only once the wrapper exists and holds its handles, so a failed allocation no longer leaks the native object. All call sites that handed over released pointers use it now, including the peer connection and the frame injectors, which bind their observer before the transfer, and createOwningObjectArray.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Several JNI call sites released the native reference before the Java wrapper existed (
JavaFactories::create(env, x.release())), so a failed wrapper allocation leaked the native object.JavaFactories::createOwning(env, std::move(ptr)), which releases the reference only once the wrapper exists and holds its handle; an overload with a bind step sets further handles (e.g. observers) before the transfer.createPeerConnectionno longer lets a C++ exception escape the JNI function, and frees connection and observer on failure; the frame injectors no longer leak their observer.createOwningObjectArrayhands over the references only after the whole array is filled.