From: Marek Smolinski Date: Thu, 5 Sep 2013 10:30:08 +0000 (+0200) Subject: Add Garbage Collector in cookie module X-Git-Tag: accepted/tizen/generic/20140307.163312~71 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=eda453186524fe5b733c2f4f2e84881c912f7fd8;p=platform%2Fcore%2Fsecurity%2Fsecurity-server.git Add Garbage Collector in cookie module [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 --- diff --git a/src/server2/client/client-get-gid.cpp b/src/server2/client/client-get-gid.cpp index db4d863..1decca8 100644 --- a/src/server2/client/client-get-gid.cpp +++ b/src/server2/client/client-get-gid.cpp @@ -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()); diff --git a/src/server2/client/client-get-object-name.cpp b/src/server2/client/client-get-object-name.cpp index da83ac0..c259a13 100644 --- a/src/server2/client/client-get-object-name.cpp +++ b/src/server2/client/client-get-object-name.cpp @@ -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."); diff --git a/src/server2/client/client-privilege-by-pid.cpp b/src/server2/client/client-privilege-by-pid.cpp index 34ebee6..ff6ddd9 100644 --- a/src/server2/client/client-privilege-by-pid.cpp +++ b/src/server2/client/client-privilege-by-pid.cpp @@ -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()); diff --git a/src/server2/client/client-shared-memory.cpp b/src/server2/client/client-shared-memory.cpp index 79ea084..a71da76 100644 --- a/src/server2/client/client-shared-memory.cpp +++ b/src/server2/client/client-shared-memory.cpp @@ -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()); diff --git a/src/server2/client/client-socket-privilege.cpp b/src/server2/client/client-socket-privilege.cpp index d7d1e5e..bca7c3d 100644 --- a/src/server2/client/client-socket-privilege.cpp +++ b/src/server2/client/client-socket-privilege.cpp @@ -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()); diff --git a/src/server2/service/cookie-jar.cpp b/src/server2/service/cookie-jar.cpp index 0c80aea..0ae2802 100644 --- a/src/server2/service/cookie-jar.cpp +++ b/src/server2/service/cookie-jar.cpp @@ -37,10 +37,13 @@ #include #include #include +#include +#include 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 diff --git a/src/server2/service/cookie-jar.h b/src/server2/service/cookie-jar.h index 3921ff2..1f81c7a 100644 --- a/src/server2/service/cookie-jar.h +++ b/src/server2/service/cookie-jar.h @@ -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 m_cookieList; }; diff --git a/src/server2/service/cookie.cpp b/src/server2/service/cookie.cpp index cadba47..c88f6fe 100644 --- a/src/server2/service/cookie.cpp +++ b/src/server2/service/cookie.cpp @@ -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) diff --git a/src/server2/service/data-share.cpp b/src/server2/service/data-share.cpp index 6351f24..2a9b820 100644 --- a/src/server2/service/data-share.cpp +++ b/src/server2/service/data-share.cpp @@ -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; } diff --git a/src/server2/service/exec-path.cpp b/src/server2/service/exec-path.cpp index 6fdbd85..6948134 100644 --- a/src/server2/service/exec-path.cpp +++ b/src/server2/service/exec-path.cpp @@ -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; } diff --git a/src/server2/service/get-gid.cpp b/src/server2/service/get-gid.cpp index 5630792..298133b 100644 --- a/src/server2/service/get-gid.cpp +++ b/src/server2/service/get-gid.cpp @@ -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; } diff --git a/src/server2/service/get-object-name.cpp b/src/server2/service/get-object-name.cpp index 101c131..d973335 100644 --- a/src/server2/service/get-object-name.cpp +++ b/src/server2/service/get-object-name.cpp @@ -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; } diff --git a/src/server2/service/privilege-by-pid.cpp b/src/server2/service/privilege-by-pid.cpp index 8067996..baea49b 100644 --- a/src/server2/service/privilege-by-pid.cpp +++ b/src/server2/service/privilege-by-pid.cpp @@ -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; }