]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
neorados: Fix use-after-move in Builder::build_ 57854/head
authorAdam Emerson <aemerson@redhat.com>
Mon, 3 Jun 2024 18:24:28 +0000 (14:24 -0400)
committerAdam Emerson <aemerson@redhat.com>
Mon, 3 Jun 2024 18:24:28 +0000 (14:24 -0400)
Missing returns in error handling would cause execution to continue
and attempt to reuse a moved-from completion

Thanks to Suyash Dongre <suyashd999@gmail.com> for finding it.

Fixes: https://tracker.ceph.com/issues/66335
Signed-off-by: Adam Emerson <aemerson@redhat.com>
src/neorados/RADOS.cc

index 3d97ead1ff7c614f61f68398124e9fddb2f85077..96165a05d14cfbfc0835fbcdc41ff4e9ddb96227 100644 (file)
@@ -829,10 +829,12 @@ void RADOS::Builder::build_(asio::io_context& ioctx,
     std::ostringstream ss;
     auto r = cct->_conf.parse_config_files(conf_files ? conf_files->data() : nullptr,
                                           &ss, flags);
-    if (r < 0)
+    if (r < 0) {
       asio::post(ioctx.get_executor(),
                 asio::append(std::move(c), ceph::to_error_code(r),
                              RADOS{nullptr}));
+      return;
+    }
   }
 
   cct->_conf.parse_env(cct->get_module_type());
@@ -840,20 +842,24 @@ void RADOS::Builder::build_(asio::io_context& ioctx,
   for (const auto& [n, v] : configs) {
     std::stringstream ss;
     auto r = cct->_conf.set_val(n, v, &ss);
-    if (r < 0)
+    if (r < 0) {
       asio::post(ioctx.get_executor(),
                 asio::append(std::move(c), ceph::to_error_code(-EINVAL),
                              RADOS{nullptr}));
+      return;
+    }
   }
 
   if (!no_mon_conf) {
     MonClient mc_bootstrap(cct, ioctx);
     // TODO This function should return an error code.
     auto err = mc_bootstrap.get_monmap_and_config();
-    if (err < 0)
+    if (err < 0) {
       asio::post(ioctx.get_executor(),
                 asio::append(std::move(c), ceph::to_error_code(err),
                              RADOS{nullptr}));
+      return;
+    }
   }
   if (!cct->_log->is_started()) {
     cct->_log->start();