Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

memtx: fix use-after-free of successor in tree_iterator_start #7759

Conversation

CuriousGeorgiy
Copy link
Member

We assumed that the successor tuple's story could not get garbage collected on clarify of result tuple in tree_iterator_start, since they coincide in case of regular iterators. But this is not the case for reverse iterators: the result tuple is of-by-one from the successor, which means the successor's story can get garbage collected along with the tuple itself getting deleted, leading to use-after-free of successor: remove garbage collection from memtx_tx_tuple_clarify and call it manually.

The crash in #7756 revealed that the put in transaction manager's story hash table was performed incorrectly: fix it and add an assertion that nothing was replaced.

Closes #7755
Closes #7756

@CuriousGeorgiy CuriousGeorgiy force-pushed the gh-77{5,6}-memtx-tree-successor-use-after-free branch 2 times, most recently from 1344779 to a92f029 Compare October 2, 2022 07:25
@CuriousGeorgiy CuriousGeorgiy force-pushed the gh-77{5,6}-memtx-tree-successor-use-after-free branch from a92f029 to d72d7c5 Compare October 3, 2022 06:22
Copy link
Contributor

@drewdzzz drewdzzz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The patch solves the set problems, but I am concerned about the current development vector - some methods categorically cannot call GC, and some methods on the contrary can do it implicitly (for example, gap trackers now should not call GC, but all other trackers can), and most importantly - during the process of development and support of transaction manager we must ensure that methods without GC do not call methods with it. I believe we need to redesign the transaction manager garbage collection system. The easiest option is to make ALL GC calls explicit.

src/box/memtx_hash.cc Show resolved Hide resolved
@drewdzzz drewdzzz assigned CuriousGeorgiy and unassigned drewdzzz Oct 31, 2022
@CuriousGeorgiy CuriousGeorgiy added the do not merge Not ready to be merged label Oct 31, 2022
@CuriousGeorgiy CuriousGeorgiy force-pushed the gh-77{5,6}-memtx-tree-successor-use-after-free branch from d72d7c5 to a81a8b0 Compare October 31, 2022 10:12
@CuriousGeorgiy CuriousGeorgiy removed their assignment Oct 31, 2022
@coveralls
Copy link

coveralls commented Oct 31, 2022

Coverage Status

Coverage increased (+0.07%) to 85.188% when pulling 8d3f75b on CuriousGeorgiy:gh-77{5,6}-memtx-tree-successor-use-after-free into a1ba58d
on tarantool:master
.

Copy link
Contributor

@drewdzzz drewdzzz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've created an issue with my concern - this patch is OK.

We assumed that the successor tuple's story could not get garbage collected
on clarify of result tuple in `tree_iterator_start`, since they coincide in
case of regular iterators. But this is not the case for reverse iterators:
the result tuple is of-by-one from the successor, which means the
successor's story can get garbage collected along with the tuple itself
getting deleted, leading to use-after-free of successor: remove garbage
collection from `memtx_tx_tuple_clarify` and call it manually.

The crash in tarantool#7756 revealed that the `put` in transaction manager's story
hash table was performed incorrectly: fix it and add an assertion that
nothing was replaced.

Closes tarantool#7755
Closes tarantool#7756

NO_DOC=bugfix
@CuriousGeorgiy CuriousGeorgiy force-pushed the gh-77{5,6}-memtx-tree-successor-use-after-free branch from a81a8b0 to 8d3f75b Compare November 9, 2022 14:47
@CuriousGeorgiy CuriousGeorgiy removed the do not merge Not ready to be merged label Nov 9, 2022
@alyapunov alyapunov added the full-ci Enables all tests for a pull request label Nov 29, 2022
@alyapunov alyapunov merged commit 651535b into tarantool:master Nov 30, 2022
@alyapunov
Copy link
Contributor

Backported to 2.10.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
full-ci Enables all tests for a pull request
Projects
None yet
4 participants