tracing: test/boost/tracing: fix use after free

fixes AddressSanitizer: stack-buffer-underflow on address 0x7ffd9a375820 at pc 0x555ac9721b4e bp 0x7ffd9a374e70 sp 0x7ffd9a374620

Backend registry holds a unique pointer to the backend implementation
that must outlive the whole tracing lifetime until the shutdown call.

So it must be catched/moved before the program exits its scope by
passing out the lambda chain.

Regarding deletion of the default destructor: moving object requires
a move constructor (for do_with) that is not implicitly provided if
there is a user-defined object destructor defined even tho its impl
is default.

Signed-off-by: Ivan Prisyazhnyy <ivan@scylladb.com>

Closes #8461
This commit is contained in:
Ivan Prisyazhnyy
2021-04-12 15:00:04 +02:00
committed by Avi Kivity
parent bad4924868
commit 0836efd830
3 changed files with 8 additions and 10 deletions

View File

@@ -37,13 +37,15 @@ future<> do_with_tracing_env(std::function<future<>(cql_test_env&)> func, cql_te
// supervisor::notify("starting tracing");
tracing::tracing::start_tracing(env.qp()).get();
return func(env).finally([](){
tracing::tracing::tracing_instance().invoke_on_all([] (tracing::tracing& local_tracing) {
return do_with(std::move(tracing_backend_registry), [func, &env](auto &reg) {
return func(env).finally([]() {
return tracing::tracing::tracing_instance().invoke_on_all([](tracing::tracing &local_tracing) {
return local_tracing.shutdown();
}).get();
}).finally([]() {
return tracing::tracing::tracing_instance().stop();
});
});
});
}, std::move(cfg_in));
}

View File

@@ -32,9 +32,6 @@ backend_registry::backend_registry()
: _impl(std::make_unique<nonstatic_class_registry<i_tracing_backend_helper, tracing&>>()) {
}
backend_registry::~backend_registry() = default;
void
backend_registry::register_backend_creator(sstring name, std::function<std::unique_ptr<i_tracing_backend_helper> (tracing&)> creator) {
_impl->register_class(std::move(name), std::move(creator));

View File

@@ -47,7 +47,6 @@ private:
void register_backend_creator(sstring name, std::function<std::unique_ptr<i_tracing_backend_helper> (tracing&)> creator);
public:
backend_registry();
~backend_registry();
std::unique_ptr<i_tracing_backend_helper> create_backend(const sstring& name, tracing& t) const; // may throw no_such_tracing_backend
template <typename Backend>
void register_backend(sstring name);