Fix segfault: capture rust heap references before yeilding to OCaml #6833
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 PR fixes the segmentation fault reported in #6824.
The 'header' (ie. data pointer + length) of the input vectors were stored in the OCaml heap. This was fine when they were run synchronously, but the async version allows the OCaml GC to run while the function is also running. A badly timed GC can move the header and leave rust's reference pointing at arbitrary data, and dereferencing the vector's data pointer may then result in a segfault.
This PR changes the behaviour to store only a (rust heap) pointer in the OCaml heap. As long as we capture the pointer before yielding to OCaml, we know that we hold a reference to the intended data.
Checklist: