Server: properly delete ServerMap on interrupted startups

A static mod error (e.g. typo) would abort the initialization but never free ServerMap
This commit is contained in:
SmallJoker 2021-02-05 18:34:25 +01:00
parent 9b64834c6a
commit d287da184c
3 changed files with 9 additions and 1 deletions

@ -116,7 +116,8 @@ bool MapSettingsManager::saveMapMeta()
{ {
// If mapgen params haven't been created yet; abort // If mapgen params haven't been created yet; abort
if (!mapgen_params) { if (!mapgen_params) {
errorstream << "saveMapMeta: mapgen_params not present!" << std::endl; infostream << "saveMapMeta: mapgen_params not present! "
<< "Server startup was probably interrupted." << std::endl;
return false; return false;
} }

@ -351,6 +351,7 @@ Server::~Server()
// Deinitialize scripting // Deinitialize scripting
infostream << "Server: Deinitializing scripting" << std::endl; infostream << "Server: Deinitializing scripting" << std::endl;
delete m_script; delete m_script;
delete m_startup_server_map; // if available
delete m_game_settings; delete m_game_settings;
while (!m_unsent_map_edit_queue.empty()) { while (!m_unsent_map_edit_queue.empty()) {
@ -399,6 +400,7 @@ void Server::init()
// Create the Map (loads map_meta.txt, overriding configured mapgen params) // Create the Map (loads map_meta.txt, overriding configured mapgen params)
ServerMap *servermap = new ServerMap(m_path_world, this, m_emerge, m_metrics_backend.get()); ServerMap *servermap = new ServerMap(m_path_world, this, m_emerge, m_metrics_backend.get());
m_startup_server_map = servermap;
// Initialize scripting // Initialize scripting
infostream << "Server: Initializing Lua" << std::endl; infostream << "Server: Initializing Lua" << std::endl;
@ -440,6 +442,7 @@ void Server::init()
m_craftdef->initHashes(this); m_craftdef->initHashes(this);
// Initialize Environment // Initialize Environment
m_startup_server_map = nullptr; // Ownership moved to ServerEnvironment
m_env = new ServerEnvironment(servermap, m_script, this, m_path_world); m_env = new ServerEnvironment(servermap, m_script, this, m_path_world);
m_inventory_mgr->setEnv(m_env); m_inventory_mgr->setEnv(m_env);

@ -547,6 +547,10 @@ private:
// Environment // Environment
ServerEnvironment *m_env = nullptr; ServerEnvironment *m_env = nullptr;
// Reference to the server map until ServerEnvironment is initialized
// after that this variable must be a nullptr
ServerMap *m_startup_server_map = nullptr;
// server connection // server connection
std::shared_ptr<con::Connection> m_con; std::shared_ptr<con::Connection> m_con;