Fix crashing smartcard-daemon
authorWonkyu Kwon <wonkyu.kwon@samsung.com>
Tue, 5 Mar 2013 14:51:58 +0000 (23:51 +0900)
committerWonkyu Kwon <wonkyu.kwon@samsung.com>
Wed, 6 Mar 2013 07:34:30 +0000 (16:34 +0900)
 - restart epoll_wait when is interruped
 - release resource before exit daemon

Change-Id: Id57c4211046ae9e8e69382828298bce169747d8e

common/IPCHelper.cpp
packaging/smartcard-service.spec
server/ServerResource.cpp
server/smartcard-daemon.cpp

index ae368f0..11f7b16 100644 (file)
@@ -197,6 +197,7 @@ ERROR :
 #ifdef USE_IPC_EPOLL
                int events = 0;
 
+again :
                if ((events = epoll_wait(fdPoll, pollEvents, EPOLL_SIZE, -1)) > 0)
                {
                        int i;
@@ -218,6 +219,16 @@ ERROR :
                                }
                        }
                }
+               else
+               {
+                       if (errno == EINTR)
+                       {
+                               char buffer[1024];
+
+                               SCARD_DEBUG_ERR("epoll_wait failed [%d], errno [%d], %s", events, errno, strerror_r(errno, buffer, sizeof(buffer)));
+                               goto again;
+                       }
+               }
 #else
                if (select(ipcSocket + 1, &fdSetRead, NULL, NULL, NULL) > 0)
                {
index 841932a..6b65206 100644 (file)
@@ -1,6 +1,6 @@
 Name:       smartcard-service
 Summary:    Smartcard Service FW
-Version:    0.1.14
+Version:    0.1.15
 Release:    0
 Group:      libs
 License:    Apache License, Version 2.0
index abcc162..4f738fa 100644 (file)
@@ -895,27 +895,30 @@ namespace smartcard_service_api
 
        void ServerResource::unloadSecureElements()
        {
-               size_t i;
-               map<unsigned int, Terminal *>::iterator item;
-
-               for (item = mapTerminals.begin(); item != mapTerminals.end(); item++)
+               if (seLoaded == true)
                {
-                       item->second->finalize();
+                       size_t i;
+                       map<unsigned int, Terminal *>::iterator item;
 
-                       IntegerHandle::releaseHandle(item->first);
-               }
+                       for (item = mapTerminals.begin(); item != mapTerminals.end(); item++)
+                       {
+                               item->second->finalize();
+
+                               IntegerHandle::releaseHandle(item->first);
+                       }
 
-               mapTerminals.clear();
+                       mapTerminals.clear();
 
-               for (i = 0; i < libraries.size(); i++)
-               {
-                       if (libraries[i] != NULL)
-                               dlclose(libraries[i]);
-               }
+                       for (i = 0; i < libraries.size(); i++)
+                       {
+                               if (libraries[i] != NULL)
+                                       dlclose(libraries[i]);
+                       }
 
-               libraries.clear();
+                       libraries.clear();
 
-               seLoaded = false;
+                       seLoaded = false;
+               }
        }
 
        bool ServerResource::isValidReaderHandle(unsigned int reader)
index aade018..4309bab 100644 (file)
@@ -233,5 +233,8 @@ int main()
 #ifdef USE_AUTOSTART
        _finalize_dbus();
 #endif
+       /* release secure element.. (pure virtual function problem..) */
+       ServerResource::getInstance().unloadSecureElements();
+
        return 0;
 }