From f61d6c6447751ac466ccd98d3f6d8464f62233c2 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 96f2ddabd0768..d5da5d80a1039 100644 --- a/src/rgw/rgw_coroutine.cc +++ b/src/rgw/rgw_coroutine.cc @@ -143,15 +143,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) { @@ -159,6 +164,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; } @@ -168,7 +176,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.39.5