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:
committed by
Avi Kivity
parent
bad4924868
commit
0836efd830
@@ -37,12 +37,14 @@ 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 local_tracing.shutdown();
|
||||
}).get();
|
||||
|
||||
return tracing::tracing::tracing_instance().stop();
|
||||
return do_with(std::move(tracing_backend_registry), [func, &env](auto ®) {
|
||||
return func(env).finally([]() {
|
||||
return tracing::tracing::tracing_instance().invoke_on_all([](tracing::tracing &local_tracing) {
|
||||
return local_tracing.shutdown();
|
||||
}).finally([]() {
|
||||
return tracing::tracing::tracing_instance().stop();
|
||||
});
|
||||
});
|
||||
});
|
||||
}, std::move(cfg_in));
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user