]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd/replicated_recovery_backend: fix use-after-move in stats 69863/head
authorSun Yuechi <sunyuechi@iscas.ac.cn>
Wed, 1 Jul 2026 08:15:17 +0000 (16:15 +0800)
committerSun Yuechi <sunyuechi@iscas.ac.cn>
Wed, 1 Jul 2026 08:15:17 +0000 (16:15 +0800)
_handle_pull_response() moved `data` and `push_op.omap_entries` into
submit_push_data() (which takes both by value) and only afterwards read
data.length() and omap_entries.size(). Both were moved-from by then, so
num_bytes_recovered and num_keys_recovered always increased by 0.

Capture the lengths before the move.

Signed-off-by: Sun Yuechi <sunyuechi@iscas.ac.cn>
src/crimson/osd/replicated_recovery_backend.cc

index 6d43707e14fbc29c8692867920b270174868cc87..ca57f5c6d7a4481900a544434e500156dca4c281 100644 (file)
@@ -919,14 +919,15 @@ ReplicatedRecoveryBackend::_handle_pull_response(
                     push_op.data_included, push_op.data);
   bool complete = pull_info.is_complete();
   bool clear_omap = !push_op.before_progress.omap_complete;
+  const auto bytes_recovered = data.length();
+  const auto keys_recovered = push_op.omap_entries.size();
   co_await submit_push_data(pull_info.recovery_info,
                            first, complete, clear_omap,
                             std::move(data_zeros), std::move(usable_intervals),
                             std::move(data), std::move(push_op.omap_header),
                             push_op.attrset, std::move(push_op.omap_entries), &t);
 
-  const auto bytes_recovered = data.length();
-  pull_info.stat.num_keys_recovered += push_op.omap_entries.size();
+  pull_info.stat.num_keys_recovered += keys_recovered;
   pull_info.stat.num_bytes_recovered += bytes_recovered;
 
   if (complete) {