ref(value)!: atomic decref result check#1763
Open
jpnurmi wants to merge 4 commits into
Open
Conversation
1f48fb6 to
654a646
Compare
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.
Note
SC/BC break (low impact)
Fixes TOCTOU races in
sentry__transaction_context_free,sentry__transaction_decrefandsentry__span_decrefby adding return value forsentry_value_decrefindicating whether the value still has references, has been freed, or is primitive that needs no tracking:While taking the BC/SC break hit, make
sentry_value_increfreturn the incref'd value for convenience, to avoid reducing such boilerplate:Transaction and span refcount decrement has TOCTOU race
Details
sentry__transaction_decref (lines 352-364) and sentry__span_decref (lines 375-388) implement non-atomic check-then-act on the reference count. The code reads the refcount, compares it to 1, and if equal, proceeds to free the object. Between the read and the free, another thread could increment the refcount (via incref), creating a use-after-free. Alternatively, two concurrent decref calls could both read refcount=2, both decrement to 1, and neither triggers the free, causing a memory leak. Or both read refcount=1 and both free, causing a double-free.
Location
src/sentry_tracing.c:352
Impact
Double-free or use-after-free from concurrent refcount operations.
Reproduction steps
Recommended fix
Use atomic decrement (e.g., __atomic_sub_fetch) and check the result atomically, ensuring the free decision is based on the atomic operation's return value.
Severity: MEDIUM
Status: Open
Category: Race Condition
Repository: getsentry/sentry-native
Branch: master