From: Kautilya Tripathi Date: Mon, 27 Apr 2026 04:36:49 +0000 (+0530) Subject: crimson/admin: avoid pg asok crashes X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8291359b8a9f306e53154dbe793f834daa7ec2ff;p=ceph.git 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 --- 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{