From 310c512b43dd81ebcb7c4a842dc6098d1a1a5345 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Sun, 1 Mar 2026 16:58:47 +0300 Subject: [PATCH] Correctly delete handle_immediate_ops when stopping a client Fixes map::at crash in some cases --- src/client/messenger.h | 2 +- src/client/msgr_receive.cpp | 5 +++-- src/client/msgr_stop.cpp | 1 + src/test/mock/messenger.cpp | 4 ++++ 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/client/messenger.h b/src/client/messenger.h index b264c044..c0beb4d2 100644 --- a/src/client/messenger.h +++ b/src/client/messenger.h @@ -209,7 +209,7 @@ protected: std::vector read_ready_clients; std::vector write_ready_clients; // We don't use ringloop->set_immediate here because we may have no ringloop in client :) - std::vector set_immediate_ops; + std::deque set_immediate_ops; public: timerfd_manager_t *tfd = NULL; diff --git a/src/client/msgr_receive.cpp b/src/client/msgr_receive.cpp index 19922779..60e9b9f0 100644 --- a/src/client/msgr_receive.cpp +++ b/src/client/msgr_receive.cpp @@ -160,8 +160,10 @@ void osd_messenger_t::clear_immediate_ops(int peer_fd) void osd_messenger_t::handle_immediate_ops() { - for (auto op: set_immediate_ops) + while (set_immediate_ops.size()) { + auto op = set_immediate_ops.front(); + set_immediate_ops.pop_front(); if (op->op_type == OSD_OP_IN) { exec_op(op); @@ -172,7 +174,6 @@ void osd_messenger_t::handle_immediate_ops() std::function(op->callback)(op); } } - set_immediate_ops.clear(); } bool osd_messenger_t::handle_read_buffer(osd_client_t *cl, void *curbuf, int remain) diff --git a/src/client/msgr_stop.cpp b/src/client/msgr_stop.cpp index e6c7f39f..ecb64e31 100644 --- a/src/client/msgr_stop.cpp +++ b/src/client/msgr_stop.cpp @@ -57,6 +57,7 @@ void osd_messenger_t::stop_client(int peer_fd, bool force, bool force_delete) { return; } + clear_immediate_ops(peer_fd); if (log_level > 0) { if (cl->osd_num) diff --git a/src/test/mock/messenger.cpp b/src/test/mock/messenger.cpp index 8443f702..911b0afd 100644 --- a/src/test/mock/messenger.cpp +++ b/src/test/mock/messenger.cpp @@ -57,3 +57,7 @@ json11::Json::object osd_messenger_t::merge_configs(const json11::Json::object & { return cli_config; } + +void osd_messenger_t::clear_immediate_ops(int peer_fd) +{ +}