From: Matan Breizman Date: Wed, 15 Nov 2023 14:05:47 +0000 (+0000) Subject: crimson/osd/osd_operations/snaptrim_event: fix lifetime on finally() X-Git-Tag: v19.0.0~62^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=84c5b6c578c1e64807eca5098d51193ee71e6106;p=ceph.git crimson/osd/osd_operations/snaptrim_event: fix lifetime on finally() Sanitized backtrace: ``` DEBUG 2023-11-14 15:23:50,871 [shard 0] osd - snaptrim_event(id=10610, detail=SnapTrimEvent(pgid=16.1a snapid=a needs_pause=0)): interrupted crimson::common::actingset_changed (acting set changed) #0 0x5653c613c071 in seastar::shared_mutex::unlock() (/usr/bin/ceph-osd+0x1ed27071) #1 0x5653c8670acf in auto seastar::futurize_invoke::ExitBarrier::BlockingEvent::Trigger >::exit()::{lambda()#1}&>(crimson::OrderedConcurrentPhaseT::ExitBarrier::BlockingEvent::Trigger >::exit()::{lambda()#1}&) (/usr/bin/ceph-osd+0x2125bacf) #2 0x5653c8670e22 in _ZN7seastar20noncopyable_functionIFNS_6futureIvEEvEE17direct_vtable_forIZNS2_4thenIZN7crimson23OrderedConcurrentPhaseTINS7_3osd13SnapTrimEvent9WaitSubopEE11ExitBarrierINSC_13BlockingEvent7TriggerISA_EEE4exitEvEUlvE_S2_EET0_OT_EUlDpOT_E_E4callEPKS4_ (/usr/bin/ceph-osd+0x2125be22) freed by thread T1 here: #0 0x7f10628b73cf in operator delete(void*, unsigned long) (/lib64/libasan.so.6+0xb73cf) #1 0x5653c8794bff in crimson::osd::SnapTrimEvent::~SnapTrimEvent() (/usr/bin/ceph-osd+0x2137fbff) previously allocated by thread T1 here: #0 0x7f10628b6367 in operator new(unsigned long) (/lib64/libasan.so.6+0xb6367) SUMMARY: AddressSanitizer: heap-use-after-free (/usr/bin/ceph-osd+0x1ed27071) in seastar::shared_mutex::unlock() ``` Signed-off-by: Matan Breizman --- diff --git a/src/crimson/osd/osd_operations/snaptrim_event.cc b/src/crimson/osd/osd_operations/snaptrim_event.cc index 21fd6e94da94..b0f5a452e7fc 100644 --- a/src/crimson/osd/osd_operations/snaptrim_event.cc +++ b/src/crimson/osd/osd_operations/snaptrim_event.cc @@ -89,6 +89,7 @@ SnapTrimEvent::snap_trim_ertr::future SnapTrimEvent::start() { ShardServices &shard_services = pg->get_shard_services(); + IRef ref = this; return interruptor::with_interruption([&shard_services, this] { return enter_stage( client_pp().wait_for_active @@ -195,7 +196,7 @@ SnapTrimEvent::start() }, [this](std::exception_ptr eptr) -> snap_trim_ertr::future { logger().debug("{}: interrupted {}", *this, eptr); return crimson::ct_error::eagain::make(); - }, pg).finally([this] { + }, pg).finally([this, ref] { logger().debug("{}: exit", *this); handle.exit(); });