From 3a6d60e9a8b86bd63cff4ce3973b18d46c1479fe Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Thu, 20 Nov 2025 17:45:58 +0100 Subject: [PATCH] Improve null checks and logging in WebSocket server message handling - Add additional null checks for user data before and after locking the mutex to prevent potential crashes. - Enhance logging to provide clearer insights when user data is invalid during message queuing. - Ensure proper message copying to a local variable before accessing the message queue, improving thread safety and stability. --- src/websocket_server.cpp | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/websocket_server.cpp b/src/websocket_server.cpp index ca4dae9..02decdc 100644 --- a/src/websocket_server.cpp +++ b/src/websocket_server.cpp @@ -368,9 +368,33 @@ int WebSocketServer::wsCallback(struct lws *wsi, // Lege Nachricht in die Queue, ohne sofort lws_callback_on_writable aufzurufen try { std::cout << "Versuche Mutex zu locken..." << std::endl; + + // Prüfe ob ud noch gültig ist, bevor wir den Mutex locken + if (!ud) { + std::cerr << "[RECEIVE] ud ist nullptr vor Mutex-Lock" << std::endl; + break; + } + + // Kopiere die Nachricht in eine lokale Variable, bevor wir den Mutex locken + std::string messageToQueue = errorResponse.dump(); + std::cout << "Nachricht kopiert: " << messageToQueue.length() << " Bytes" << std::endl; + + // Prüfe ob ud noch gültig ist, bevor wir den Mutex locken + if (!ud) { + std::cerr << "[RECEIVE] ud ist nullptr nach Kopieren der Nachricht" << std::endl; + break; + } + std::lock_guard lock(ud->messageQueueMutex); std::cout << "Mutex gelockt, füge Nachricht zur Queue hinzu..." << std::endl; - ud->messageQueue.push(errorResponse.dump()); + + // Prüfe ob ud noch gültig ist, nachdem wir den Mutex gelockt haben + if (!ud) { + std::cerr << "[RECEIVE] ud ist nullptr nach Mutex-Lock" << std::endl; + break; + } + + ud->messageQueue.push(messageToQueue); std::cout << "ud->messageQueue.size(): " << ud->messageQueue.size() << std::endl; } catch (const std::exception &e) { std::cerr << "[RECEIVE] Fehler beim Zugriff auf messageQueue: " << e.what() << std::endl;