Add Garbage Collector in cookie module
authorMarek Smolinski <m.smolinski@samsung.com>
Thu, 5 Sep 2013 10:30:08 +0000 (12:30 +0200)
committerBartlomiej Grzelewski <b.grzelewski@samsung.com>
Thu, 6 Feb 2014 16:13:22 +0000 (17:13 +0100)
[Issue#]   SSDWSSP-495
[Bug]      N/A
[Cause]    N/A
[Solution] Add GC,gc is called each GET_COOKIE API call
[Verification] build

Change-Id: I8c64dec020174025a355ae067cb59ca5f140c117

13 files changed:
src/server2/client/client-get-gid.cpp
src/server2/client/client-get-object-name.cpp
src/server2/client/client-privilege-by-pid.cpp
src/server2/client/client-shared-memory.cpp
src/server2/client/client-socket-privilege.cpp
src/server2/service/cookie-jar.cpp
src/server2/service/cookie-jar.h
src/server2/service/cookie.cpp
src/server2/service/data-share.cpp
src/server2/service/exec-path.cpp
src/server2/service/get-gid.cpp
src/server2/service/get-object-name.cpp
src/server2/service/privilege-by-pid.cpp

index db4d863..1decca8 100644 (file)
@@ -50,8 +50,7 @@ int security_server_get_gid(const char *objectName) {
         }
 
         SocketBuffer send, recv;
-        Serialization ser;
-        ser.Serialize(send, std::string(objectName));
+        Serialization::Serialize(send, std::string(objectName));
 
         int retCode = sendToServer(
           SERVICE_SOCKET_GET_GID,
@@ -61,8 +60,7 @@ int security_server_get_gid(const char *objectName) {
         if (retCode != SECURITY_SERVER_API_SUCCESS)
             return retCode;
 
-        Deserialization des;
-        des.Deserialize(recv, retCode);
+        Deserialization::Deserialize(recv, retCode);
 
         // Return if errors
         if (retCode < 0)
@@ -70,7 +68,7 @@ int security_server_get_gid(const char *objectName) {
 
         // No errors, return gid
         gid_t gid;
-        des.Deserialize(recv, gid);
+        Deserialization::Deserialize(recv, gid);
         return gid;
     } catch (SocketBuffer::Exception::Base &e) {
         LogDebug("SecurityServer::SocketBuffer::Exception " << e.DumpToString());
index da83ac0..c259a13 100644 (file)
@@ -45,8 +45,7 @@ int security_server_get_object_name(gid_t gid, char *pObjectName, size_t maxObje
         }
 
         SocketBuffer send, recv;
-        Serialization ser;
-        ser.Serialize(send, gid);
+        Serialization::Serialize(send, gid);
 
         int result = sendToServer(
           SERVICE_SOCKET_GET_OBJECT_NAME,
@@ -57,11 +56,10 @@ int security_server_get_object_name(gid_t gid, char *pObjectName, size_t maxObje
         if (result != SECURITY_SERVER_API_SUCCESS)
             return result;
 
-        Deserialization des;
-        des.Deserialize(recv, result);
+        Deserialization::Deserialize(recv, result);
 
         std::string retObjectName;
-        des.Deserialize(recv, retObjectName);
+        Deserialization::Deserialize(recv, retObjectName);
 
         if(retObjectName.size() > maxObjectSize){
             LogError("Objects name is too big. Need more space in pObjectName buffer.");
index 34ebee6..ff6ddd9 100644 (file)
@@ -47,10 +47,9 @@ int security_server_check_privilege_by_pid(
             return SECURITY_SERVER_API_SUCCESS;
 
         SocketBuffer send, recv;
-        Serialization ser;
-        ser.Serialize(send, pid);
-        ser.Serialize(send, std::string(object));
-        ser.Serialize(send, std::string(access_rights));
+        Serialization::Serialize(send, pid);
+        Serialization::Serialize(send, std::string(object));
+        Serialization::Serialize(send, std::string(access_rights));
 
         int result = sendToServer(
           SERVICE_SOCKET_PRIVILEGE_BY_PID,
@@ -60,8 +59,7 @@ int security_server_check_privilege_by_pid(
         if (result != SECURITY_SERVER_API_SUCCESS)
             return result;
 
-        Deserialization des;
-        des.Deserialize(recv, result);
+        Deserialization::Deserialize(recv, result);
         return result;
     } catch (SocketBuffer::Exception::Base &e) {
         LogDebug("SecurityServer::SocketBuffer::Exception " << e.DumpToString());
index 79ea084..a71da76 100644 (file)
@@ -49,9 +49,8 @@ int security_server_app_give_access(const char *customer_label, int customer_pid
         }
 
         SocketBuffer send, recv;
-        Serialization ser;
-        ser.Serialize(send, std::string(customer_label));
-        ser.Serialize(send, customer_pid);
+        Serialization::Serialize(send, std::string(customer_label));
+        Serialization::Serialize(send, customer_pid);
 
         int result = sendToServer(
           SERVICE_SOCKET_SHARED_MEMORY,
@@ -61,8 +60,7 @@ int security_server_app_give_access(const char *customer_label, int customer_pid
         if (result != SECURITY_SERVER_API_SUCCESS)
             return result;
 
-        Deserialization des;
-        des.Deserialize(recv, result);
+        Deserialization::Deserialize(recv, result);
         return result;
     } catch (SocketBuffer::Exception::Base &e) {
         LogDebug("SecurityServer::SocketBuffer::Exception " << e.DumpToString());
index d7d1e5e..bca7c3d 100644 (file)
@@ -43,8 +43,7 @@ static int get_exec_path(pid_t pid, std::string &exe)
 
     try{
         SocketBuffer send, recv;
-        Serialization ser;
-        ser.Serialize(send, pid);
+        Serialization::Serialize(send, pid);
 
         int result = sendToServer(
                 SERVICE_SOCKET_EXEC_PATH,
@@ -53,12 +52,11 @@ static int get_exec_path(pid_t pid, std::string &exe)
         if(result != SECURITY_SERVER_API_SUCCESS)
             return result;
 
-        Deserialization des;
-        des.Deserialize(recv, result);
+        Deserialization::Deserialize(recv, result);
         if(result != SECURITY_SERVER_API_SUCCESS)
             return result;
 
-        des.Deserialize(recv, exe);
+        Deserialization::Deserialize(recv, exe);
         return result;
     } catch (SocketBuffer::Exception::Base &e) {
         LogDebug("SecurityServer::SocketBuffer::Exception " << e.DumpToString());
index 0c80aea..0ae2802 100644 (file)
 #include <sys/smack.h>
 #include <fstream>
 #include <linux/limits.h>
+#include <signal.h>
+#include <errno.h>
 
 namespace SecurityServer {
 
 CookieJar::CookieJar(void)
+  : m_position(0)
 {
     LogDebug("Created CookieJar for handling cookies");
 }
@@ -224,4 +227,27 @@ bool CookieJar::CompareCookies(const Cookie &c1, const Cookie &c2, CompareType c
     };
 }
 
+void CookieJar::GarbageCollector(size_t howMany)
+{
+    if ((howMany == 0) || (howMany > m_cookieList.size())) {
+        howMany = m_cookieList.size();
+    }
+
+    for (size_t i = 0; i < howMany; ++i) {
+
+        if (m_position >= m_cookieList.size()) {
+            m_position = 0;
+        }
+
+        if (kill(m_cookieList[m_position].pid, 0) && (errno == ESRCH)) {
+            LogDebug("Cookie deleted " << " PID:" << m_cookieList[m_position].pid);
+            if (m_position != (m_cookieList.size()-1))
+                m_cookieList[m_position] = *m_cookieList.rbegin();
+            m_cookieList.pop_back();
+        } else {
+            ++m_position;
+        }
+    }
+}
+
 } // namespace SecurityServer
index 3921ff2..1f81c7a 100644 (file)
@@ -63,7 +63,7 @@ class CookieJar
 {
 public:
     CookieJar(void);
-    ~CookieJar(void);
+    virtual ~CookieJar(void);
 
     const Cookie * GenerateCookie(int pid);
     void DeleteCookie(const Cookie &pattern, CompareType criterion);
@@ -71,7 +71,12 @@ public:
     const Cookie * SearchCookie(const Cookie &pattern, CompareType criterion) const;
     bool CompareCookies(const Cookie &c1, const Cookie &c2, CompareType criterion) const;
 
+    // howMany - number of cookies that will be checked.
+    // Set howMay to 0 to check all cookies.
+    void GarbageCollector(size_t howMany);
+
 private:
+    size_t m_position;
     std::vector<Cookie> m_cookieList;
 };
 
index cadba47..c88f6fe 100644 (file)
@@ -103,6 +103,7 @@ bool CookieService::readOne(const ConnectionID &conn, SocketBuffer &buffer, int
     LogDebug("Iteration begin");
     SocketBuffer send, recv;
     int msgType;
+    bool removeGarbage = false;
 
     //waiting for all data
     if (!buffer.Ready()) {
@@ -126,6 +127,7 @@ bool CookieService::readOne(const ConnectionID &conn, SocketBuffer &buffer, int
         case CookieCall::GET_COOKIE:
             LogDebug("Entering get-cookie server side handler");
             retval = cookieRequest(send, conn.sock);
+            removeGarbage = true;
             break;
 
         default:
@@ -183,15 +185,19 @@ bool CookieService::readOne(const ConnectionID &conn, SocketBuffer &buffer, int
         retval = false;
     }
 
-    if (retval == false) {  //something goes wrong with communication
-        LogDebug("Closing socket because of error");
-        m_serviceManager->Close(conn);
-        return retval;
-    } else {
+    if (retval) {
         //send response
         m_serviceManager->Write(conn, send.Pop());
-        return retval;
+    } else {
+        LogDebug("Closing socket because of error");
+        m_serviceManager->Close(conn);
     }
+
+    // Each time you add one cookie check 2 others.
+    if (removeGarbage)
+        m_cookieJar.GarbageCollector(2);
+
+    return retval;
 }
 
 bool CookieService::cookieRequest(SocketBuffer &send, int socket)
index 6351f24..2a9b820 100644 (file)
@@ -92,9 +92,8 @@ bool SharedMemoryService::readOne(const ConnectionID &conn, SocketBuffer &buffer
     }
 
     Try {
-        SecurityServer::Deserialization des;
-        des.Deserialize(buffer, clientLabel);
-        des.Deserialize(buffer, clientPid);
+        Deserialization::Deserialize(buffer, clientLabel);
+        Deserialization::Deserialize(buffer, clientPid);
      } Catch (SocketBuffer::Exception::Base) {
         LogDebug("Broken protocol. Closing socket.");
         m_serviceManager->Close(conn);
@@ -138,9 +137,8 @@ end:
     free(providerLabel);
     smack_accesses_free(smack);
 
-    SecurityServer::Serialization ser;
     SocketBuffer sendBuffer;
-    ser.Serialize(sendBuffer, retCode);
+    Serialization::Serialize(sendBuffer, retCode);
     m_serviceManager->Write(conn, sendBuffer.Pop());
     return true;
 }
index 6fdbd85..6948134 100644 (file)
@@ -91,15 +91,13 @@ bool ExecPathService::processOne(const ConnectionID &conn, SocketBuffer &buffer)
     }
 
     Try {
-        SecurityServer::Deserialization des;
-        des.Deserialize(buffer, pid);
+        Deserialization::Deserialize(buffer, pid);
      } Catch (SocketBuffer::Exception::Base) {
         LogDebug("Broken protocol. Closing socket.");
         m_serviceManager->Close(conn);
         return false;
     }
 
-    SecurityServer::Serialization ser;
     SocketBuffer sendBuffer;
     int retVal;
 
@@ -114,14 +112,14 @@ bool ExecPathService::processOne(const ConnectionID &conn, SocketBuffer &buffer)
     {
          LogError("Server: Failed to read executable path for pid " << pid);
          retVal = SECURITY_SERVER_API_ERROR_SERVER_ERROR;
-         ser.Serialize(sendBuffer, retVal);
+         Serialization::Serialize(sendBuffer, retVal);
          m_serviceManager->Write(conn, sendBuffer.Pop());
          return true;
     }
 
     retVal = SECURITY_SERVER_API_SUCCESS;
-    ser.Serialize(sendBuffer, retVal);
-    ser.Serialize(sendBuffer, exec_path);
+    Serialization::Serialize(sendBuffer, retVal);
+    Serialization::Serialize(sendBuffer, exec_path);
     m_serviceManager->Write(conn, sendBuffer.Pop());
     return true;
 }
index 5630792..298133b 100644 (file)
@@ -127,8 +127,7 @@ bool GetGidService::readOne(const ConnectionID &conn, SocketBuffer &buffer) {
 
     // Get objects name:
     Try {
-        SecurityServer::Deserialization des;
-        des.Deserialize(buffer, objectName);
+        Deserialization::Deserialize(buffer, objectName);
      } Catch (SocketBuffer::Exception::Base) {
         LogDebug("Broken protocol. Closing socket.");
         m_serviceManager->Close(conn);
@@ -139,10 +138,9 @@ bool GetGidService::readOne(const ConnectionID &conn, SocketBuffer &buffer) {
     retCode = setGid(objectName);
 
     // Send the result
-    SecurityServer::Serialization ser;
     SocketBuffer sendBuffer;
-    ser.Serialize(sendBuffer, retCode);
-    ser.Serialize(sendBuffer, m_gid);
+    Serialization::Serialize(sendBuffer, retCode);
+    Serialization::Serialize(sendBuffer, m_gid);
     m_serviceManager->Write(conn, sendBuffer.Pop());
     return true;
 }
index 101c131..d973335 100644 (file)
@@ -130,8 +130,7 @@ bool GetObjectNameService::readOne(const ConnectionID &conn, SocketBuffer &buffe
 
     // Get objects GID:
     Try {
-        SecurityServer::Deserialization des;
-        des.Deserialize(buffer, gid);
+        Deserialization::Deserialize(buffer, gid);
      } Catch (SocketBuffer::Exception::Base) {
         LogDebug("Broken protocol. Closing socket.");
         m_serviceManager->Close(conn);
@@ -142,10 +141,9 @@ bool GetObjectNameService::readOne(const ConnectionID &conn, SocketBuffer &buffe
     retCode = setName(gid);
 
     // Send the result
-    SecurityServer::Serialization ser;
     SocketBuffer sendBuffer;
-    ser.Serialize(sendBuffer, retCode);
-    ser.Serialize(sendBuffer, m_name);
+    Serialization::Serialize(sendBuffer, retCode);
+    Serialization::Serialize(sendBuffer, m_name);
     m_serviceManager->Write(conn, sendBuffer.Pop());
     return true;
 }
index 8067996..baea49b 100644 (file)
@@ -98,10 +98,9 @@ bool PrivilegeByPidService::readOne(const ConnectionID &conn, SocketBuffer &buff
     }
 
     Try {
-        SecurityServer::Deserialization des;
-        des.Deserialize(buffer, pid);
-        des.Deserialize(buffer, object);
-        des.Deserialize(buffer, access_rights);
+        Deserialization::Deserialize(buffer, pid);
+        Deserialization::Deserialize(buffer, object);
+        Deserialization::Deserialize(buffer, access_rights);
     } Catch (SocketBuffer::Exception::Base) {
         LogDebug("Broken protocol. Closing socket.");
         m_serviceManager->Close(conn);
@@ -150,9 +149,8 @@ bool PrivilegeByPidService::readOne(const ConnectionID &conn, SocketBuffer &buff
     else                //there is no permission
         retCode = SECURITY_SERVER_API_ERROR_ACCESS_DENIED;
 
-    SecurityServer::Serialization ser;
     SocketBuffer sendBuffer;
-    ser.Serialize(sendBuffer, retCode);
+    Serialization::Serialize(sendBuffer, retCode);
     m_serviceManager->Write(conn, sendBuffer.Pop());
     return true;
 }