From d6d9b820e45563d1d2df255c7c11c08e3eac4a32 Mon Sep 17 00:00:00 2001 From: Bartlomiej Grzelewski Date: Thu, 11 Jun 2015 17:33:50 +0200 Subject: [PATCH] Fix serious bug that causes crash on CKM exit. Change-Id: Idef7ad9a4606b16f293a1052c313fa045a2f5da5 --- src/manager/main/generic-socket-manager.h | 3 +++ src/manager/main/key-manager-main.cpp | 2 +- src/manager/main/service-thread.h | 3 +-- src/manager/main/socket-manager.cpp | 14 +++++++++++--- src/manager/service/ckm-service.cpp | 8 ++++++++ src/manager/service/ckm-service.h | 4 ++++ src/manager/service/ocsp-service.cpp | 8 ++++++++ src/manager/service/ocsp-service.h | 4 ++++ 8 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/manager/main/generic-socket-manager.h b/src/manager/main/generic-socket-manager.h index f1d20af..c9d5eda 100644 --- a/src/manager/main/generic-socket-manager.h +++ b/src/manager/main/generic-socket-manager.h @@ -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: diff --git a/src/manager/main/key-manager-main.cpp b/src/manager/main/key-manager-main.cpp index a6af572..71c76e7 100644 --- a/src/manager/main/key-manager-main.cpp +++ b/src/manager/main/key-manager-main.cpp @@ -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) { diff --git a/src/manager/main/service-thread.h b/src/manager/main/service-thread.h index e480458..2b0609b 100644 --- a/src/manager/main/service-thread.h +++ b/src/manager/main/service-thread.h @@ -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: diff --git a/src/manager/main/socket-manager.cpp b/src/manager/main/socket-manager.cpp index bde932f..4a5e147 100644 --- a/src/manager/main/socket-manager.cpp +++ b/src/manager/main/socket-manager.cpp @@ -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) diff --git a/src/manager/service/ckm-service.cpp b/src/manager/service/ckm-service.cpp index 235fe47..644e1c4 100644 --- a/src/manager/service/ckm-service.cpp +++ b/src/manager/service/ckm-service.cpp @@ -43,6 +43,14 @@ CKMService::~CKMService() { delete m_logic; } +void CKMService::Start() { + Create(); +} + +void CKMService::Stop() { + Join(); +} + GenericSocketService::ServiceDescriptionVector CKMService::GetServiceDescription() { return ServiceDescriptionVector { diff --git a/src/manager/service/ckm-service.h b/src/manager/service/ckm-service.h index 59fa010..b8b6c55 100644 --- a/src/manager/service/ckm-service.h +++ b/src/manager/service/ckm-service.h @@ -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(); diff --git a/src/manager/service/ocsp-service.cpp b/src/manager/service/ocsp-service.cpp index 6bc28cf..c2a6a23 100644 --- a/src/manager/service/ocsp-service.cpp +++ b/src/manager/service/ocsp-service.cpp @@ -42,6 +42,14 @@ OCSPService::~OCSPService() { delete m_logic; } +void OCSPService::Start() { + Create(); +} + +void OCSPService::Stop() { + Join(); +} + GenericSocketService::ServiceDescriptionVector OCSPService::GetServiceDescription() { return ServiceDescriptionVector { diff --git a/src/manager/service/ocsp-service.h b/src/manager/service/ocsp-service.h index 85e6072..16121ec 100644 --- a/src/manager/service/ocsp-service.h +++ b/src/manager/service/ocsp-service.h @@ -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(); -- 2.7.4