From: Konrad Lipinski Date: Wed, 13 Jul 2022 13:25:52 +0000 (+0200) Subject: Make socket manager counters more robust X-Git-Tag: submit/tizen_6.5/20230221.091000~7 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=50fe29e97504a155ffa04ef554e032bcf297a6d9;p=platform%2Fcore%2Fsecurity%2Fsecurity-manager.git Make socket manager counters more robust Now that the service no longer needs to maintain a dictionary of all socket connections, socket counters no longer need to be globally unique. The only remaining use for those counters now involves checking whether a particular socket descriptor has gone stale. Per-descriptor counters are enough for that, incremented every time a particular descriptor is reopened. * use per-socket counters instead of a global one * use unsigned for guaranteed wraparound * increment counter when closing instead of when opening to make the check for isOpen unnecessary when checking connections enqueued in m_closeQueue or m_writeBufferQueue Change-Id: I5b9102c6fe3f9eb183ce456d1334173ac37aab4b --- diff --git a/src/server/main/include/generic-socket-manager.h b/src/server/main/include/generic-socket-manager.h index c545894a..e1b4b6c6 100644 --- a/src/server/main/include/generic-socket-manager.h +++ b/src/server/main/include/generic-socket-manager.h @@ -39,11 +39,8 @@ namespace SecurityManager { struct ConnectionID { - int sock; // This is decriptor used for connection - int counter; // Unique handler per socket - inline bool operator<(const ConnectionID &second) const { - return counter < second.counter; - } + int sock; // Socket file descriptor number. + unsigned counter; // Unique counter per that descriptor number. }; struct GenericSocketManager; diff --git a/src/server/main/include/socket-manager.h b/src/server/main/include/socket-manager.h index 9e6ffa23..7c9a7907 100644 --- a/src/server/main/include/socket-manager.h +++ b/src/server/main/include/socket-manager.h @@ -76,7 +76,7 @@ protected: struct SocketDescription { bool isOpen = false; bool isTimeout = false; - int counter = -1; + unsigned counter = 0; time_t timeout = 0; MessageBuffer buffer; }; @@ -104,7 +104,6 @@ protected: fd_set m_writeSet; int m_maxDesc = 0; int m_signalFd, m_listenSock = -1, m_notifyMe; - int m_counter = 0; std::mutex m_eventQueueMutex; std::queue m_writeBufferQueue; std::queue m_closeQueue; diff --git a/src/server/main/socket-manager.cpp b/src/server/main/socket-manager.cpp index 1284081e..7950dc45 100644 --- a/src/server/main/socket-manager.cpp +++ b/src/server/main/socket-manager.cpp @@ -73,7 +73,6 @@ void SocketManager::CreateDefaultReadSocketDescription(int sock) auto &desc = m_socketDescriptionVector[sock]; desc.isOpen = true; - desc.counter = ++m_counter; desc.timeout = monotonicNow() + SOCKET_TIMEOUT; desc.buffer.InitForInput(); @@ -511,15 +510,9 @@ void SocketManager::ProcessQueue() { auto &desc = m_socketDescriptionVector[buffer.connectionID.sock]; - if (!desc.isOpen) { - LogDebug("Received packet for write but connection is closed. Packet ignored! Socket: " - << buffer.connectionID.sock); - continue; - } - if (desc.counter != buffer.connectionID.counter) { - LogDebug("Received packet for write but counter is broken. Packet ignored! Socket: " + LogDebug("Received packet for write but connection is closed. Packet ignored! Socket: " << buffer.connectionID.sock); continue; } @@ -541,9 +534,6 @@ void SocketManager::ProcessQueue() { m_closeQueue.pop(); } - if (!m_socketDescriptionVector[connection.sock].isOpen) - continue; - if (connection.counter != m_socketDescriptionVector[connection.sock].counter) continue; @@ -563,6 +553,7 @@ void SocketManager::CloseSocket(int sock) { } desc.isOpen = false; + desc.counter++; desc.buffer.Clear(); close(sock); diff --git a/src/server/service/base-service.cpp b/src/server/service/base-service.cpp index dc2c931b..7fa17527 100644 --- a/src/server/service/base-service.cpp +++ b/src/server/service/base-service.cpp @@ -46,7 +46,8 @@ BaseService::BaseService(Offline offline) void BaseService::process(MessageEvent &&event) { - LogDebug("Message event for counter: " << event.connectionID.counter); + LogDebug("Message event for socket " << event.connectionID.sock << + " counter " << event.connectionID.counter); processOne(event.connectionID, event.creds, event.messageBuffer); }