From e706b9db5c5d79366c5167d01ad46e13f8500936 Mon Sep 17 00:00:00 2001 From: Hualong Feng Date: Fri, 2 Jul 2021 14:22:06 +0800 Subject: [PATCH] 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 --- src/librbd/cache/pwl/LogOperation.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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() { -- 2.47.3