Security-server fix.
authorBartlomiej Grzelewski <b.grzelewski@samsung.com>
Tue, 30 Jul 2013 11:20:25 +0000 (13:20 +0200)
committerBartlomiej Grzelewski <b.grzelewski@samsung.com>
Thu, 6 Feb 2014 16:13:21 +0000 (17:13 +0100)
[Issue#]      N/A
[Bug/Feature] Null dereference when client closes connection while
              servier is writting.
[Cause]       N/A
[Problem]     N/A
[Solution]    Add additional check in CloseSocket function.

[Verification] Build, run tests.

Change-Id: I026b4cff31868dd72a1d221b8bffad108fcdf350

src/server2/main/socket-manager.cpp

index a1683be..beef398 100644 (file)
@@ -121,6 +121,7 @@ void SocketManager::ReadyForAccept(int sock) {
     unsigned int clientLen = sizeof(clientAddr);
     LogInfo("Accept on sock: " << sock);
     int client = accept4(sock, (struct sockaddr*) &clientAddr, &clientLen, SOCK_NONBLOCK);
+    LogInfo("Socket opended: " << client);
     if (-1 == client) {
         int err = errno;
         LogDebug("Error in accept: " << strerror(err));
@@ -519,8 +520,16 @@ void SocketManager::ProcessQueue() {
 }
 
 void SocketManager::CloseSocket(int sock) {
+    LogInfo("Closing socket: " << sock);
     auto &desc = m_socketDescriptionVector[sock];
 
+    if (!(desc.isOpen)) {
+        // This may happend when some information was waiting for write to the
+        // socket and in the same time socket was closed by the client.
+        LogError("Socket " << sock << " is not open. Nothing to do!");
+        return;
+    }
+
     GenericSocketService::CloseEvent event;
     event.connectionID.sock = sock;
     event.connectionID.counter = desc.counter;
@@ -531,7 +540,11 @@ void SocketManager::CloseSocket(int sock) {
     desc.interfaceID = -1;
     desc.rawBuffer.clear();
 
-    service->Event(event);
+    if (service)
+        service->Event(event);
+    else
+        LogError("Critical! Service is NULL! This should never happend!");
+
     TEMP_FAILURE_RETRY(close(sock));
     FD_CLR(sock, &m_readSet);
     FD_CLR(sock, &m_writeSet);