From 1c6281e531999e62b063cb7cc7630480ab2abebd Mon Sep 17 00:00:00 2001 From: Or Friedmann Date: Tue, 19 Apr 2022 12:00:28 +0000 Subject: [PATCH] rgw: RGWCoroutine::set_sleeping() checks for null stack users of the RGWOmapAppend coroutine don't manage the lifetime of its underlying coroutine stack, so end up making calls on RGWOmapAppend after its stack goes away. this null check is a band-aid, and there are still several other calls in RGWCoroutine that don't check for null stack Fixes: https://tracker.ceph.com/issues/49302 Signed-off-by: Or Friedmann Signed-off-by: Casey Bodley (cherry picked from commit 3f0f831d66c7d43c9872f5de2aceb68aef4004d8) --- src/rgw/rgw_coroutine.cc | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/rgw/rgw_coroutine.cc b/src/rgw/rgw_coroutine.cc index 98397655ee43..0e474ae148e9 100644 --- a/src/rgw/rgw_coroutine.cc +++ b/src/rgw/rgw_coroutine.cc @@ -142,15 +142,20 @@ RGWCoroutine::~RGWCoroutine() { void RGWCoroutine::init_new_io(RGWIOProvider *io_provider) { + ceph_assert(stack); // if there's no stack, io_provider won't be uninitialized stack->init_new_io(io_provider); } void RGWCoroutine::set_io_blocked(bool flag) { - stack->set_io_blocked(flag); + if (stack) { + stack->set_io_blocked(flag); + } } void RGWCoroutine::set_sleeping(bool flag) { - stack->set_sleeping(flag); + if (stack) { + stack->set_sleeping(flag); + } } int RGWCoroutine::io_block(int ret, int64_t io_id) { @@ -158,6 +163,9 @@ int RGWCoroutine::io_block(int ret, int64_t io_id) { } int RGWCoroutine::io_block(int ret, const rgw_io_id& io_id) { + if (!stack) { + return 0; + } if (stack->consume_io_finish(io_id)) { return 0; } @@ -167,7 +175,9 @@ int RGWCoroutine::io_block(int ret, const rgw_io_id& io_id) { } void RGWCoroutine::io_complete(const rgw_io_id& io_id) { - stack->io_complete(io_id); + if (stack) { + stack->io_complete(io_id); + } } void RGWCoroutine::StatusItem::dump(Formatter *f) const { -- 2.47.3