From 5ce1cc4e6a064f8a743ecdabffa243ee47d3cc82 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Thu, 20 Nov 2025 17:47:20 +0100 Subject: [PATCH] Refine null checks and logging in WebSocket server message handling - Introduce a local copy of user data before locking the mutex to ensure validity during message queuing. - Enhance null checks and logging to provide clearer insights when user data or message queue access fails. - Implement exception handling for message queue access to improve stability and error visibility. --- src/websocket_server.cpp | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/src/websocket_server.cpp b/src/websocket_server.cpp index 02decdc..2a99238 100644 --- a/src/websocket_server.cpp +++ b/src/websocket_server.cpp @@ -385,17 +385,34 @@ int WebSocketServer::wsCallback(struct lws *wsi, break; } - std::lock_guard lock(ud->messageQueueMutex); - std::cout << "Mutex gelockt, füge Nachricht zur Queue hinzu..." << std::endl; - - // 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; + // Speichere ud-Pointer vor dem Locken, um sicherzustellen, dass er gültig bleibt + WebSocketUserData* udCopy = ud; + if (!udCopy) { + std::cerr << "[RECEIVE] udCopy ist nullptr" << std::endl; break; } - ud->messageQueue.push(messageToQueue); - std::cout << "ud->messageQueue.size(): " << ud->messageQueue.size() << std::endl; + std::lock_guard lock(udCopy->messageQueueMutex); + std::cout << "Mutex gelockt, füge Nachricht zur Queue hinzu..." << std::endl; + + // Prüfe ob udCopy noch gültig ist, nachdem wir den Mutex gelockt haben + if (!udCopy) { + std::cerr << "[RECEIVE] udCopy ist nullptr nach Mutex-Lock" << std::endl; + break; + } + + // Test-Zugriff auf messageQueue, um zu prüfen ob sie gültig ist + try { + volatile size_t testSize = udCopy->messageQueue.size(); + (void)testSize; + std::cout << "messageQueue ist gültig, aktuelle Größe: " << udCopy->messageQueue.size() << std::endl; + } catch (...) { + std::cerr << "[RECEIVE] messageQueue ist ungültig (Exception beim Zugriff)" << std::endl; + break; + } + + udCopy->messageQueue.push(messageToQueue); + std::cout << "ud->messageQueue.size(): " << udCopy->messageQueue.size() << std::endl; } catch (const std::exception &e) { std::cerr << "[RECEIVE] Fehler beim Zugriff auf messageQueue: " << e.what() << std::endl; break;