From 8291359b8a9f306e53154dbe793f834daa7ec2ff Mon Sep 17 00:00:00 2001 From: Kautilya Tripathi Date: Mon, 27 Apr 2026 10:06:49 +0530 Subject: [PATCH] crimson/admin: avoid pg asok crashes Keep parsed command data alive while running hooks to avoid a stack-use-after-return in Formatter::create(). Return -EAGAIN from PGCommand when the OSDMap is not ready. Signed-off-by: Kautilya Tripathi --- src/crimson/admin/admin_socket.cc | 7 ++++++- src/crimson/admin/pg_commands.cc | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/crimson/admin/admin_socket.cc b/src/crimson/admin/admin_socket.cc index b4c454f08d50..56dee2def0bb 100644 --- a/src/crimson/admin/admin_socket.cc +++ b/src/crimson/admin/admin_socket.cc @@ -196,7 +196,12 @@ auto AdminSocket::execute_command(const std::vector& cmd, tell_result_t{-EINVAL, "invalid command json", std::move(out)}); } DEBUG("validated {} {}", cmd, os.str()); - return parsed->hook.call(parsed->params, parsed->format, std::move(buf)); + auto owned = std::move(*parsed); + return seastar::do_with(std::move(owned), std::move(buf), + [](const parsed_command_t& parsed, + ceph::bufferlist& buf) mutable { + return parsed.hook.call(parsed.params, parsed.format, std::move(buf)); + }); } else { DEBUG("failed to parse"); auto& result = std::get(maybe_parsed); diff --git a/src/crimson/admin/pg_commands.cc b/src/crimson/admin/pg_commands.cc index d8738b14779d..38f357029224 100644 --- a/src/crimson/admin/pg_commands.cc +++ b/src/crimson/admin/pg_commands.cc @@ -54,6 +54,10 @@ public: } // am i the primary for this pg? const auto osdmap = osd.get_shard_services().get_map(); + if (!osdmap || osdmap->get_epoch() == 0) { + return seastar::make_ready_future(tell_result_t{ + -EAGAIN, "osdmap is not ready"}); + } spg_t spg_id; if (!osdmap->get_primary_shard(pgid, &spg_id)) { return seastar::make_ready_future(tell_result_t{ -- 2.47.3