protect new cons cell in named StretchyList::push_back() - #1490
Open
kevinushey wants to merge 1 commit into
Open
protect new cons cell in named StretchyList::push_back()#1490kevinushey wants to merge 1 commit into
kevinushey wants to merge 1 commit into
Conversation
The named variant of push_back() allocated the new cons cell before constructing the Symbol for its tag. If the tag name was not yet interned, Rf_install() could allocate and trigger a garbage collection that reclaimed the still-unreachable cell. Construct the Symbol first, matching push_front(). Fixes #1489.
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.
Fixes #1489.
The named variant of
StretchyList::push_back()allocated the new cons cell before constructing theSymbolfor its tag. If the tag name was not yet interned,Rf_install()could allocate and trigger a garbage collection that reclaimed the still-unreachable cell;SET_TAG()then wrote into a reclaimed node, which was subsequently linked into the list. See #1489 for a reproducible example viaRcpp::sourceCpp()andgctorture().The fix constructs the
Symbolbefore callingRf_cons(), matching the ordering already used by the named variant ofpush_front().Also adds a regression test exercising named
push_back()with a freshly generated (never-interned) tag name undergctorture(); the test fails without the header change and passes with it.Checklist
R CMD checkstill passes all tests (checked locally withRunAllRcppTests=yeson R 4.6.1;--no-manual --no-vignettes, so the only flagged items were two vignette-packaging warnings from the local--no-build-vignettesbuild)