From: Hualong Feng Date: Fri, 2 Jul 2021 06:22:06 +0000 (+0800) Subject: librbd/cache/pwl: avoid stack overflow caused by nested shared_ptr destruction X-Git-Tag: v17.1.0~1174^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e706b9db5c5d79366c5167d01ad46e13f8500936;p=ceph.git librbd/cache/pwl: avoid stack overflow caused by nested shared_ptr destruction Destruction of nested shared_ptr will cause stack overflow. With the explicit assignment of nullptr, the deleted node is completely disconnected from the current linked list ------- ******* ------- |sync | <--earlier-- |sync | <--earlier-x- |sync | |point| --later----> |point| --later----x> |point| ------- ******* ------- | | | V V V ------- ------- ------- |log_ | ---next----> |log_ | ---next----x> |log_ | |entry| |entry| |entry| ------- ------- ------- earlier: earlier_sync_point later: later_sync_point next: next_sync_point_entry Fixes: https://tracker.ceph.com/issues/51418 Signed-off-by: Feng Hualong --- diff --git a/src/librbd/cache/pwl/LogOperation.cc b/src/librbd/cache/pwl/LogOperation.cc index 701fe14b1a602..2c5a5ef78d638 100644 --- a/src/librbd/cache/pwl/LogOperation.cc +++ b/src/librbd/cache/pwl/LogOperation.cc @@ -70,9 +70,10 @@ std::vector SyncPointLogOperation::append_sync_point() { void SyncPointLogOperation::clear_earlier_sync_point() { std::lock_guard locker(m_lock); ceph_assert(sync_point->later_sync_point); - ceph_assert(sync_point->later_sync_point->earlier_sync_point == - sync_point); + ceph_assert(sync_point->later_sync_point->earlier_sync_point == sync_point); sync_point->later_sync_point->earlier_sync_point = nullptr; + sync_point->later_sync_point = nullptr; + sync_point->log_entry->next_sync_point_entry = nullptr; } std::vector SyncPointLogOperation::swap_on_sync_point_persisted() {