Skip to content

Commit 76927c4

Browse files
Gerry Bolandgerboland
authored andcommitted
Fix crash if exception thrown during daemon startup
The "system" loggers have different lifecycle to the client loggers. Client loggers register/unregister themselves with the MultiplexingLogger on creation/destruction. However "system" loggers did not, and would leave a dangling pointer in the MultiplexingLogger if they were destroyed before it was. Fix is to treat system logger ownership differently from client, i.e. have MultiplexingLogger own the system logger. Crash without this patch can be easily reproduced by adding a throw in the QemuVirtualMachineFactory constructor.
1 parent 6c95ada commit 76927c4

File tree

4 files changed

+11
-5
lines changed

4 files changed

+11
-5
lines changed

include/multipass/logging/multiplexing_logger.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,13 @@ namespace logging
3131
class MultiplexingLogger : public Logger
3232
{
3333
public:
34+
explicit MultiplexingLogger(UPtr system_logger);
3435
void log(Level level, CString category, CString message) const override;
3536
void add_logger(const Logger* logger);
3637
void remove_logger(const Logger* logger);
3738

3839
private:
40+
UPtr system_logger;
3941
mutable std::shared_timed_mutex mutex;
4042
std::vector<const Logger*> loggers;
4143
};

src/daemon/daemon_config.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@ std::unique_ptr<const mp::DaemonConfig> mp::DaemonConfigBuilder::build()
6464
if (logger == nullptr)
6565
logger = std::make_unique<mpl::StandardLogger>(verbosity_level);
6666

67-
auto multiplexing_logger = std::make_shared<mpl::MultiplexingLogger>();
68-
multiplexing_logger->add_logger(logger.get());
67+
auto multiplexing_logger = std::make_shared<mpl::MultiplexingLogger>(std::move(logger));
6968
mpl::set_logger(multiplexing_logger);
7069

7170
if (cache_directory.isEmpty())
@@ -113,6 +112,6 @@ std::unique_ptr<const mp::DaemonConfig> mp::DaemonConfigBuilder::build()
113112
return std::unique_ptr<const DaemonConfig>(
114113
new DaemonConfig{std::move(url_downloader), std::move(factory), std::move(image_hosts), std::move(vault),
115114
std::move(name_generator), std::move(ssh_key_provider), std::move(cert_provider),
116-
std::move(client_cert_store), std::move(logger), multiplexing_logger, cache_directory,
115+
std::move(client_cert_store), multiplexing_logger, cache_directory,
117116
data_directory, server_address, ssh_username, connection_type, image_refresh_timer});
118117
}

src/daemon/daemon_config.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ struct DaemonConfig
4949
const std::unique_ptr<SSHKeyProvider> ssh_key_provider;
5050
const std::unique_ptr<CertProvider> cert_provider;
5151
const std::unique_ptr<CertStore> client_cert_store;
52-
const std::unique_ptr<logging::Logger> system_logger;
5352
const std::shared_ptr<logging::MultiplexingLogger> logger;
5453
const multipass::Path cache_directory;
5554
const multipass::Path data_directory;

src/logging/multiplexing_logger.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,15 @@
2121

2222
namespace mpl = multipass::logging;
2323

24+
multipass::logging::MultiplexingLogger::MultiplexingLogger(UPtr system_logger)
25+
: system_logger{std::move(system_logger)}
26+
{
27+
}
28+
2429
void mpl::MultiplexingLogger::log(mpl::Level level, CString category, CString message) const
2530
{
2631
std::shared_lock<decltype(mutex)> lock{mutex};
32+
system_logger->log(level, category, message);
2733
for (auto logger : loggers)
2834
logger->log(level, category, message);
2935
}
@@ -38,4 +44,4 @@ void mpl::MultiplexingLogger::remove_logger(const Logger* logger)
3844
{
3945
std::lock_guard<decltype(mutex)> lock{mutex};
4046
loggers.erase(std::remove(loggers.begin(), loggers.end(), logger), loggers.end());
41-
}
47+
}

0 commit comments

Comments
 (0)