From 15da50c815aa74e6132a9aa3df59c9f17bd6b4c3 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Mon, 12 Nov 2018 14:34:01 +0000 Subject: [PATCH] Fix get_server_status() segfault due to uninitialized m_env Fixes #7857 --- src/server.cpp | 58 ++++++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/src/server.cpp b/src/server.cpp index 71a349b08..ef282ec51 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -334,7 +334,7 @@ Server::~Server() { MutexAutoLock envlock(m_env_mutex); - + infostream << "Server: Saving players" << std::endl; m_env->saveLoadedPlayers(); @@ -3013,36 +3013,44 @@ PlayerSAO* Server::getPlayerSAO(u16 peer_id) std::wstring Server::getStatusString() { std::wostringstream os(std::ios_base::binary); - os< clients = m_clients.getClientIDs(); - for (std::vector::iterator i = clients.begin(); i != clients.end(); ++i) { - // Get player - RemotePlayer *player = m_env->getPlayer(*i); - // Get name of player - std::wstring name = L"unknown"; - if (player != NULL) - name = narrow_to_wide(player->getName()); - // Add name to information string - if(!first) - os << L", "; - else - first = false; - os << name; + os << L", clients={"; + if (m_env) { + std::vector clients = m_clients.getClientIDs(); + for (session_t client_id : clients) { + RemotePlayer *player = m_env->getPlayer(client_id); + + // Get name of player + std::wstring name = L"unknown"; + if (player) + name = narrow_to_wide(player->getName()); + + // Add name to information string + if (!first) + os << L", "; + else + first = false; + + os << name; + } } os << L"}"; - if(((ServerMap*)(&m_env->getMap()))->isSavingEnabled() == false) - os<get("motd") != "") - os<get("motd")); + + if (m_env && !((ServerMap*)(&m_env->getMap()))->isSavingEnabled()) + os << std::endl << L"# Server: " << " WARNING: Map saving is disabled."; + + if (!g_settings->get("motd").empty()) + os << std::endl << L"# Server: " << narrow_to_wide(g_settings->get("motd")); + return os.str(); } @@ -3577,7 +3585,7 @@ void Server::requestShutdown(const std::string &msg, bool reconnect, float delay if (delay == 0.0f) { // No delay, shutdown immediately m_shutdown_requested = true; - // only print to the infostream, a chat message saying + // only print to the infostream, a chat message saying // "Server Shutting Down" is sent when the server destructs. infostream << "*** Immediate Server shutdown requested." << std::endl; } else if (delay < 0.0f && m_shutdown_timer > 0.0f) {