diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2020-12-11 09:05:26 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2020-12-11 09:05:26 +0200 |
commit | 8677c14e65f436db00be5aedb1f644fcffc70f7e (patch) | |
tree | 45f9212af72f0163198822f175956259318beb02 /extra/mariabackup/xtrabackup.cc | |
parent | 0c7c449267655ed759f223067c5095d7df3665b3 (diff) | |
download | mariadb-git-8677c14e65f436db00be5aedb1f644fcffc70f7e.tar.gz |
MDEV-24391 heap-use-after-free in fil_space_t::flush_low()bb-10.5-MDEV-24391
We observed a race condition that involved two threads
executing fil_flush_file_spaces() and one thread
executing fil_delete_tablespace(). After one of the
fil_flush_file_spaces() observed that
space.needs_flush_not_stopping() is set and was
releasing the fil_system.mutex, the other fil_flush_file_spaces()
would complete the execution of fil_space_t::flush_low() on
the same tablespace. Then, fil_delete_tablespace() would
destroy the object, because the value of fil_space_t::n_pending
did not prevent that. Finally, the fil_flush_file_spaces() would
resume execution and invoke fil_space_t::flush_low() on the freed
object.
This race condition was introduced in
commit 118e258aaac5da75a2ac4556201aaea3688fac67 of MDEV-23855.
fil_space_t::flush(): Add a template parameter that indicates
whether the caller is holding a reference to prevent the
tablespace from being freed.
buf_dblwr_t::flush_buffered_writes_completed(),
row_quiesce_table_start(): Acquire a reference for the duration
of the fil_space_t::flush_low() operation. It should be impossible
for the object to be freed in these code paths, but we want to
satisfy the debug assertions.
fil_space_t::flush_low(): Do not increment or decrement the
reference count, but instead assert that the caller is holding
a reference.
fil_space_extend_must_retry(), fil_flush_file_spaces():
Acquire a reference before releasing fil_system.mutex.
This is what will fix the race condition.
Diffstat (limited to 'extra/mariabackup/xtrabackup.cc')
-rw-r--r-- | extra/mariabackup/xtrabackup.cc | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index d44e212d58a..94b10019e1d 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -552,7 +552,7 @@ void CorruptedPages::zero_out_free_pages() *page_it, space_name.c_str()); } } - space->flush(); + space->flush<true>(); space->release(); } m_spaces.swap(non_free_pages); |