Fix serious bug that causes crash on CKM exit. 15/41215/1
authorBartlomiej Grzelewski <b.grzelewski@samsung.com>
Thu, 11 Jun 2015 15:33:50 +0000 (17:33 +0200)
committerBartlomiej Grzelewski <b.grzelewski@samsung.com>
Thu, 11 Jun 2015 15:48:39 +0000 (17:48 +0200)
Change-Id: Idef7ad9a4606b16f293a1052c313fa045a2f5da5

src/manager/main/generic-socket-manager.h
src/manager/main/key-manager-main.cpp
src/manager/main/service-thread.h
src/manager/main/socket-manager.cpp
src/manager/service/ckm-service.cpp
src/manager/service/ckm-service.h
src/manager/service/ocsp-service.cpp
src/manager/service/ocsp-service.h

index f1d20af..c9d5eda 100644 (file)
@@ -114,6 +114,9 @@ struct GenericSocketService {
     virtual void Event(const ReadEvent &event) = 0;
     virtual void Event(const CloseEvent &event) = 0;
 
+    virtual void Start() = 0;
+    virtual void Stop() = 0;
+
     GenericSocketService() : m_serviceManager(NULL) {}
     virtual ~GenericSocketService(){}
 protected:
index a6af572..71c76e7 100644 (file)
@@ -47,7 +47,7 @@ void registerSocketService(CKM::SocketManager &manager, const std::string& servi
     T *service = NULL;
     try {
         service = new T();
-        service->Create();
+        service->Start();
         manager.RegisterSocketService(service);
         service = NULL;
     } catch (const CKM::Exception &exception) {
index e480458..2b0609b 100644 (file)
@@ -74,8 +74,7 @@ public:
 
     virtual ~ServiceThread()
     {
-        if (m_state != State::NoThread)
-            Join();
+        assert((m_state == State::NoThread) && "Thread was not stopped before ServiceThread destruction!");
     }
 
 protected:
index bde932f..4a5e147 100644 (file)
@@ -90,6 +90,10 @@ struct DummyService : public GenericSocketService {
     ServiceDescriptionVector GetServiceDescription() {
         return ServiceDescriptionVector();
     }
+
+    void Start() {}
+    void Stop() {}
+
     void Event(const AcceptEvent &event) { (void)event; }
     void Event(const WriteEvent &event) { (void)event; }
     void Event(const ReadEvent &event) { (void)event; }
@@ -111,6 +115,9 @@ struct SignalService : public GenericSocketService {
         return ServiceDescriptionVector();
     }
 
+    void Start() {}
+    void Stop() {}
+
     void Event(const AcceptEvent &event) { (void)event; } // not supported
     void Event(const WriteEvent &event) { (void)event; }  // not supported
     void Event(const CloseEvent &event) { (void)event; }  // not supported
@@ -212,9 +219,10 @@ SocketManager::~SocketManager() {
             serviceMap.insert(m_socketDescriptionVector[i].service);
 
     // Time to destroy all services.
-    for(auto it = serviceMap.begin(); it != serviceMap.end(); ++it) {
-        LogDebug("delete " << (void*)(*it));
-        delete *it;
+    for (auto service : serviceMap) {
+        LogDebug("delete " << (void*)(service));
+        service->Stop();
+        delete service;
     }
 
     for (size_t i = 0; i < m_socketDescriptionVector.size(); ++i)
index 235fe47..644e1c4 100644 (file)
@@ -43,6 +43,14 @@ CKMService::~CKMService() {
     delete m_logic;
 }
 
+void CKMService::Start() {
+    Create();
+}
+
+void CKMService::Stop() {
+    Join();
+}
+
 GenericSocketService::ServiceDescriptionVector CKMService::GetServiceDescription()
 {
     return ServiceDescriptionVector {
index 59fa010..b8b6c55 100644 (file)
@@ -37,6 +37,10 @@ public:
     CKMService(CKMService &&) = delete;
     CKMService& operator=(const CKMService &) = delete;
     CKMService& operator=(CKMService &&) = delete;
+
+    virtual void Start(void);
+    virtual void Stop(void);
+
     virtual ~CKMService();
 
     ServiceDescriptionVector GetServiceDescription();
index 6bc28cf..c2a6a23 100644 (file)
@@ -42,6 +42,14 @@ OCSPService::~OCSPService() {
     delete m_logic;
 }
 
+void OCSPService::Start() {
+    Create();
+}
+
+void OCSPService::Stop() {
+    Join();
+}
+
 GenericSocketService::ServiceDescriptionVector OCSPService::GetServiceDescription()
 {
     return ServiceDescriptionVector {
index 85e6072..16121ec 100644 (file)
@@ -36,6 +36,10 @@ public:
     OCSPService(OCSPService &&) = delete;
     OCSPService& operator=(const OCSPService &) = delete;
     OCSPService& operator=(OCSPService &&) = delete;
+
+    virtual void Start();
+    virtual void Stop();
+
     virtual ~OCSPService();
 
     ServiceDescriptionVector GetServiceDescription();