Fix a potential crash in logging handlers

This commit is contained in:
Michael Zanetti 2020-09-09 19:19:42 +02:00
parent 2ca4b2f32f
commit 4d480f7c3b
5 changed files with 11 additions and 0 deletions

View File

@ -53,6 +53,7 @@
namespace nymeaserver { namespace nymeaserver {
QList<QWebSocket*> DebugServerHandler::s_websocketClients; QList<QWebSocket*> DebugServerHandler::s_websocketClients;
QMutex DebugServerHandler::s_loggingMutex;
DebugServerHandler::DebugServerHandler(QObject *parent) : DebugServerHandler::DebugServerHandler(QObject *parent) :
QObject(parent) QObject(parent)
@ -572,6 +573,7 @@ void DebugServerHandler::logMessageHandler(QtMsgType type, const QMessageLogCont
break; break;
} }
QMutexLocker locker(&s_loggingMutex);
foreach (QWebSocket *client, s_websocketClients) { foreach (QWebSocket *client, s_websocketClients) {
client->sendTextMessage(finalMessage); client->sendTextMessage(finalMessage);
} }

View File

@ -36,6 +36,7 @@
#include <QProcess> #include <QProcess>
#include <QUrlQuery> #include <QUrlQuery>
#include <QWebSocketServer> #include <QWebSocketServer>
#include <QMutex>
#include "debugreportgenerator.h" #include "debugreportgenerator.h"
#include "servers/httpreply.h" #include "servers/httpreply.h"
@ -53,6 +54,7 @@ public:
private: private:
static QList<QWebSocket*> s_websocketClients; static QList<QWebSocket*> s_websocketClients;
static void logMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &message); static void logMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &message);
static QMutex s_loggingMutex;
QWebSocketServer *m_websocketServer = nullptr; QWebSocketServer *m_websocketServer = nullptr;

View File

@ -53,6 +53,7 @@ namespace nymeaserver {
QList<ScriptEngine*> ScriptEngine::s_engines; QList<ScriptEngine*> ScriptEngine::s_engines;
QtMessageHandler ScriptEngine::s_upstreamMessageHandler; QtMessageHandler ScriptEngine::s_upstreamMessageHandler;
QLoggingCategory::CategoryFilter ScriptEngine::s_oldCategoryFilter = nullptr; QLoggingCategory::CategoryFilter ScriptEngine::s_oldCategoryFilter = nullptr;
QMutex ScriptEngine::s_loggerMutex;
ScriptEngine::ScriptEngine(ThingManager *deviceManager, QObject *parent) : QObject(parent), ScriptEngine::ScriptEngine(ThingManager *deviceManager, QObject *parent) : QObject(parent),
m_deviceManager(deviceManager) m_deviceManager(deviceManager)
@ -446,6 +447,7 @@ void ScriptEngine::logMessageHandler(QtMsgType type, const QMessageLogContext &c
return; return;
} }
QMutexLocker locker(&s_loggerMutex);
// Copy the message to the script engine // Copy the message to the script engine
foreach (ScriptEngine *engine, s_engines) { foreach (ScriptEngine *engine, s_engines) {
engine->onScriptMessage(type, context, message); engine->onScriptMessage(type, context, message);

View File

@ -36,6 +36,7 @@
#include <QQmlEngine> #include <QQmlEngine>
#include <QJsonValue> #include <QJsonValue>
#include <QLoggingCategory> #include <QLoggingCategory>
#include <QMutex>
#include "integrations/thingmanager.h" #include "integrations/thingmanager.h"
#include "script.h" #include "script.h"
@ -111,6 +112,7 @@ private:
static QLoggingCategory::CategoryFilter s_oldCategoryFilter; static QLoggingCategory::CategoryFilter s_oldCategoryFilter;
static void logMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &message); static void logMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &message);
static void logCategoryFilter(QLoggingCategory *category); static void logCategoryFilter(QLoggingCategory *category);
static QMutex s_loggerMutex;
}; };
} }

View File

@ -32,6 +32,7 @@
#include <QFileInfo> #include <QFileInfo>
#include <QDir> #include <QDir>
#include <QDateTime> #include <QDateTime>
#include <QMutex>
QStringList s_nymeaLoggingCategories; QStringList s_nymeaLoggingCategories;
@ -80,6 +81,7 @@ NYMEA_LOGGING_CATEGORY(dcI2C, "I2C")
static QFile s_logFile; static QFile s_logFile;
static bool s_useColors; static bool s_useColors;
static QList<QtMessageHandler> s_handlers; static QList<QtMessageHandler> s_handlers;
static QMutex s_loggerMutex;
static const char *const normal = "\033[0m"; static const char *const normal = "\033[0m";
static const char *const warning = "\033[33m"; static const char *const warning = "\033[33m";
@ -130,6 +132,7 @@ void nymeaLogMessageHandler(QtMsgType type, const QMessageLogContext &context, c
} }
fflush(stdout); fflush(stdout);
QMutexLocker locker(&s_loggerMutex);
if (s_logFile.isOpen()) { if (s_logFile.isOpen()) {
QTextStream textStream(&s_logFile); QTextStream textStream(&s_logFile);
textStream << messageString << endl; textStream << messageString << endl;