From c25f3eced8d89d3e49fde05eef37fa8b1700573a Mon Sep 17 00:00:00 2001 From: Yaniv Michael Kaul Date: Wed, 25 Mar 2026 13:05:52 +0200 Subject: [PATCH] gms/gossiper: fix use-after-move in do_send_ack2_msg The second logger.debug() call accesses ack2_msg after it was moved via std::move() in the co_await send_gossip_digest_ack2 call. This is undefined behavior. Fix by formatting ack2_msg to a string before the move, then using that cached string in both debug log calls. Fixes: https://scylladb.atlassian.net/browse/SCYLLADB-1778 Closes scylladb/scylladb#29227 (cherry picked from commit 93722f2c8950a1d8afe9041927e63abd93a1daa1) Closes scylladb/scylladb#29710 --- gms/gossiper.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gms/gossiper.cc b/gms/gossiper.cc index 186037e955..058ded7bd4 100644 --- a/gms/gossiper.cc +++ b/gms/gossiper.cc @@ -399,9 +399,10 @@ future<> gossiper::do_send_ack2_msg(locator::host_id from, utils::chunked_vector } } gms::gossip_digest_ack2 ack2_msg(std::move(delta_ep_state_map)); - logger.debug("Calling do_send_ack2_msg to node {}, ack_msg_digest={}, ack2_msg={}", from, ack_msg_digest, ack2_msg); + auto ack2_msg_str = fmt::format("{}", ack2_msg); + logger.debug("Calling do_send_ack2_msg to node {}, ack_msg_digest={}, ack2_msg={}", from, ack_msg_digest, ack2_msg_str); co_await ser::gossip_rpc_verbs::send_gossip_digest_ack2(&_messaging, from, std::move(ack2_msg)); - logger.debug("finished do_send_ack2_msg to node {}, ack_msg_digest={}, ack2_msg={}", from, ack_msg_digest, ack2_msg); + logger.debug("finished do_send_ack2_msg to node {}, ack_msg_digest={}, ack2_msg={}", from, ack_msg_digest, ack2_msg_str); } // Depends on