]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/admin: avoid pg asok crashes crimson-pg-subcommands 66993/head
authorKautilya Tripathi <kautilya.tripathi@ibm.com>
Mon, 27 Apr 2026 04:36:49 +0000 (10:06 +0530)
committerKautilya Tripathi <kautilya.tripathi@ibm.com>
Mon, 27 Apr 2026 04:39:35 +0000 (10:09 +0530)
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 <kautilya.tripathi@ibm.com>
src/crimson/admin/admin_socket.cc
src/crimson/admin/pg_commands.cc

index b4c454f08d506b7c9fe575d86142ad30600c4824..56dee2def0bb62c02128fc5f4529b19743f1cd73 100644 (file)
@@ -196,7 +196,12 @@ auto AdminSocket::execute_command(const std::vector<std::string>& 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<tell_result_t>(maybe_parsed);
index d8738b14779d5f47e922a7700130931540a286dc..38f357029224e12f27f6757bb34299ebb66a33aa 100644 (file)
@@ -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>(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>(tell_result_t{