Replace some functions with thread safe version.
authorBartlomiej Grzelewski <b.grzelewski@samsung.com>
Tue, 21 Oct 2014 13:54:31 +0000 (15:54 +0200)
committerMaciej J. Karpiuk <m.karpiuk2@samsung.com>
Tue, 17 Feb 2015 10:00:03 +0000 (11:00 +0100)
Change-Id: I749eaea647c39d7b25125ed72feb5ee22ddc38dd

src/manager/client-async/connection-thread.cpp
src/manager/client-async/service.cpp
src/manager/client/client-common.cpp
src/manager/common/descriptor-set.cpp
src/manager/main/socket-manager.cpp
src/manager/service/file-system.cpp

index a927d29..8cd76b4 100644 (file)
 #include <connection-thread.h>
 #include <unistd.h>
 #include <poll.h>
+
+#include <dpl/errno_string.h>
 #include <dpl/log/log.h>
+
 #include <client-common.h>
 
 namespace CKM {
@@ -34,7 +37,7 @@ const int POLL_TIMEOUT = 8000;
 ConnectionThread::Pipe::Pipe()
 {
     if (-1 == pipe(m_pipe))
-        ThrowMsg(PipeError, "Pipe creation failed " << strerror(errno));
+        ThrowMsg(PipeError, "Pipe creation failed " << GetErrnoString(errno));
 }
 
 ConnectionThread::Pipe::~Pipe()
@@ -46,7 +49,7 @@ ConnectionThread::Pipe::~Pipe()
 void ConnectionThread::Pipe::notify()
 {
     if (-1 == TEMP_FAILURE_RETRY(write(m_pipe[1],"j",1)))
-        ThrowMsg(PipeError, "Writing pipe failed " << strerror(errno));
+        ThrowMsg(PipeError, "Writing pipe failed " << GetErrnoString(errno));
 }
 
 ConnectionThread::ConnectionThread() :
@@ -121,7 +124,7 @@ void ConnectionThread::readPipe(int pipe, short revents)
 
     if(1 != TEMP_FAILURE_RETRY(read(pipe,buffer, 1))) {
         int err = errno;
-        ThrowMsg(PipeError, "Failed to read pipe: " << strerror(err));
+        ThrowMsg(PipeError, "Failed to read pipe: " << GetErrnoString(err));
     }
 }
 
index 5eb8756..03ce4da 100644 (file)
  */
 
 #include <service.h>
+
+#include <dpl/errno_string.h>
 #include <dpl/log/log.h>
+
 #include <storage-receiver.h>
 #include <ocsp-receiver.h>
 #include <protocols.h>
@@ -130,7 +133,7 @@ void Service::sendData()
             if (EAGAIN == err || EWOULDBLOCK == err)
                 return;
 
-            LogError("Error in write: " << strerror(err));
+            LogError("Error in write: " << GetErrnoString(err));
             serviceError(CKM_API_ERROR_SEND_FAILED);
             return;
         }
@@ -158,7 +161,7 @@ void Service::receiveData()
     ssize_t temp = TEMP_FAILURE_RETRY(read(m_socket->Get(), buffer, RECV_BUFFER_SIZE));
     if (-1 == temp) {
         int err = errno;
-        LogError("Error in read: " << strerror(err));
+        LogError("Error in read: " << GetErrnoString(err));
         serviceError(CKM_API_ERROR_RECV_FAILED);
         return;
     }
index f4782c1..916e5c4 100644 (file)
@@ -28,6 +28,7 @@
 #include <sys/un.h>
 #include <unistd.h>
 
+#include <dpl/errno_string.h>
 #include <dpl/log/log.h>
 #include <dpl/serialization.h>
 #include <dpl/singleton.h>
@@ -64,7 +65,7 @@ int waitForSocket(int sock, int event, int timeout) {
         LogDebug("Poll timeout");
     } else if (-1 == retval) {
         int err = errno;
-        LogError("Error in poll: " << strerror(err));
+        LogError("Error in poll: " << CKM::GetErrnoString(err));
     }
     return retval;
 }
@@ -84,7 +85,7 @@ int connectSocket(int& sock, char const * const interface) {
     sock = socket(AF_UNIX, SOCK_STREAM, 0);
     if (sock < 0) {
         int err = errno;
-        LogError("Error creating socket: " << strerror(err));
+        LogError("Error creating socket: " << GetErrnoString(err));
         return CKM_API_ERROR_SOCKET;
     }
 
@@ -92,7 +93,7 @@ int connectSocket(int& sock, char const * const interface) {
         fcntl(sock, F_SETFL, flags | O_NONBLOCK) < 0)
     {
         int err = errno;
-        LogError("Error in fcntl: " << strerror(err));
+        LogError("Error in fcntl: " << GetErrnoString(err));
         return CKM_API_ERROR_SOCKET;
     }
 
@@ -123,7 +124,7 @@ int connectSocket(int& sock, char const * const interface) {
 
         if (-1 == retval) {
             int err = errno;
-            LogError("Error in getsockopt: " << strerror(err));
+            LogError("Error in getsockopt: " << GetErrnoString(err));
             return CKM_API_ERROR_SOCKET;
         }
 
@@ -133,7 +134,7 @@ int connectSocket(int& sock, char const * const interface) {
         }
 
         if (error != 0) {
-            LogError("Error in connect: " << strerror(error));
+            LogError("Error in connect: " << GetErrnoString(error));
             return CKM_API_ERROR_SOCKET;
         }
 
@@ -142,7 +143,7 @@ int connectSocket(int& sock, char const * const interface) {
 
     if (-1 == retval) {
         int err = errno;
-        LogError("Error connecting socket: " << strerror(err));
+        LogError("Error connecting socket: " << GetErrnoString(err));
         if (err == EACCES)
             return CKM_API_ERROR_ACCESS_DENIED;
         return CKM_API_ERROR_SOCKET;
@@ -170,7 +171,7 @@ int sendToServer(char const * const interface, const RawBuffer &send, MessageBuf
         ssize_t temp = TEMP_FAILURE_RETRY(write(sock.Get(), &send[done], send.size() - done));
         if (-1 == temp) {
             int err = errno;
-            LogError("Error in write: " << strerror(err));
+            LogError("Error in write: " << GetErrnoString(err));
             return CKM_API_ERROR_SOCKET;
         }
         done += temp;
@@ -184,7 +185,7 @@ int sendToServer(char const * const interface, const RawBuffer &send, MessageBuf
         ssize_t temp = TEMP_FAILURE_RETRY(read(sock.Get(), buffer, 2048));
         if (-1 == temp) {
             int err = errno;
-            LogError("Error in read: " << strerror(err));
+            LogError("Error in read: " << GetErrnoString(err));
             return CKM_API_ERROR_SOCKET;
         }
 
index 9312c73..8e36bed 100644 (file)
@@ -20,6 +20,7 @@
  */
 
 #include "descriptor-set.h"
+#include <dpl/errno_string.h>
 #include <dpl/log/log.h>
 #include <string.h>
 #include <unistd.h>
@@ -69,7 +70,7 @@ void DescriptorSet::wait(int timeout_ms) {
         ThrowMsg(Timeout, "Poll timeout");
     } else if (ret < 0) {
         int err = errno;
-        ThrowMsg(InternalError, "Poll failed " << strerror(err));
+        ThrowMsg(InternalError, "Poll failed " << GetErrnoString(err));
     }
 
     notify(ret);
index 99ac4a5..405add5 100644 (file)
@@ -40,6 +40,7 @@
 
 #include <systemd/sd-daemon.h>
 
+#include <dpl/errno_string.h>
 #include <dpl/log/log.h>
 #include <dpl/assert.h>
 
@@ -176,7 +177,7 @@ SocketManager::SocketManager()
     FD_ZERO(&m_writeSet);
     if (-1 == pipe(m_notifyMe)) {
         int err = errno;
-        ThrowMsg(Exception::InitFailed, "Error in pipe: " << strerror(err));
+        ThrowMsg(Exception::InitFailed, "Error in pipe: " << GetErrnoString(err));
     }
     LogInfo("Pipe: Read desc: " << m_notifyMe[0] << " Write desc: " << m_notifyMe[1]);
 
@@ -233,7 +234,7 @@ void SocketManager::ReadyForAccept(int sock) {
 //    LogInfo("Accept on sock: " << sock << " Socket opended: " << client);
     if (-1 == client) {
         int err = errno;
-        LogDebug("Error in accept: " << strerror(err));
+        LogDebug("Error in accept: " << GetErrnoString(err));
         return;
     }
 
@@ -284,7 +285,7 @@ void SocketManager::ReadyForRead(int sock) {
             case EINTR:
                 break;
             default:
-                LogDebug("Reading sock error: " << strerror(err));
+                LogDebug("Reading sock error: " << GetErrnoString(err));
                 CloseSocket(sock);
         }
     }
@@ -303,7 +304,7 @@ void SocketManager::ReadyForWriteBuffer(int sock) {
             break;
         case EPIPE:
         default:
-            LogDebug("Error during write: " << strerror(err));
+            LogDebug("Error during write: " << GetErrnoString(err));
             CloseSocket(sock);
             break;
         }
@@ -422,7 +423,7 @@ void SocketManager::MainLoop() {
                 break;
             default:
                 int err = errno;
-                LogError("Error in select: " << strerror(err));
+                LogError("Error in select: " << GetErrnoString(err));
                 return;
             }
             continue;
@@ -483,8 +484,8 @@ int SocketManager::CreateDomainSocketHelp(
 
     if (-1 == (sockfd = socket(AF_UNIX, SOCK_STREAM, 0))) {
         int err = errno;
-        LogError("Error in socket: " << strerror(err));
-        ThrowMsg(Exception::InitFailed, "Error in socket: " << strerror(err));
+        LogError("Error in socket: " << GetErrnoString(err));
+        ThrowMsg(Exception::InitFailed, "Error in socket: " << GetErrnoString(err));
     }
 
     if (smack_check()) {
@@ -505,8 +506,8 @@ int SocketManager::CreateDomainSocketHelp(
     if (-1 == fcntl(sockfd, F_SETFL, flags | O_NONBLOCK)) {
         int err = errno;
         close(sockfd);
-        LogError("Error in fcntl: " << strerror(err));
-        ThrowMsg(Exception::InitFailed, "Error in fcntl: " << strerror(err));
+        LogError("Error in fcntl: " << GetErrnoString(err));
+        ThrowMsg(Exception::InitFailed, "Error in fcntl: " << GetErrnoString(err));
     }
 
     sockaddr_un serverAddress;
@@ -521,8 +522,8 @@ int SocketManager::CreateDomainSocketHelp(
     if (-1 == bind(sockfd, (struct sockaddr*)&serverAddress, sizeof(serverAddress))) {
         int err = errno;
         close(sockfd);
-        LogError("Error in bind: " << strerror(err));
-        ThrowMsg(Exception::InitFailed, "Error in bind: " << strerror(err));
+        LogError("Error in bind: " << GetErrnoString(err));
+        ThrowMsg(Exception::InitFailed, "Error in bind: " << GetErrnoString(err));
     }
 
     umask(originalUmask);
@@ -530,8 +531,8 @@ int SocketManager::CreateDomainSocketHelp(
     if (-1 == listen(sockfd, 5)) {
         int err = errno;
         close(sockfd);
-        LogError("Error in listen: " << strerror(err));
-        ThrowMsg(Exception::InitFailed, "Error in listen: " << strerror(err));
+        LogError("Error in listen: " << GetErrnoString(err));
+        ThrowMsg(Exception::InitFailed, "Error in listen: " << GetErrnoString(err));
     }
 
     return sockfd;
index 94b2b05..6580a34 100644 (file)
@@ -30,6 +30,7 @@
 #include <sstream>
 #include <fstream>
 
+#include <dpl/errno_string.h>
 #include <dpl/log/log.h>
 
 #include <file-system.h>
@@ -148,7 +149,7 @@ int FileSystem::init() {
     if ((mkdir(CKM_DATA_PATH.c_str(), 0700)) && (errno != EEXIST)) {
         int err = errno;
         LogError("Error in mkdir. Data directory could not be created. Errno: "
-            << err << " (" << strerror(err) << ")");
+            << err << " (" << GetErrnoString(err) << ")");
         return -1; // TODO set up some error code
     }
     return 0;
@@ -156,20 +157,27 @@ int FileSystem::init() {
 
 UidVector FileSystem::getUIDsFromDBFile() {
     UidVector uids;
-    DIR *dirp = NULL;
-    errno = 0;
+    std::unique_ptr<DIR, std::function<int(DIR*)>>
+        dirp(::opendir(CKM_DATA_PATH.c_str()), ::closedir);
 
-    if((dirp = opendir(CKM_DATA_PATH.c_str())) == NULL) {
+    if (!dirp.get()) {
         int err = errno;
-        LogError("Error in opendir. Data directory could not be read. Errno: "
-                << err << " (" << strerror(err) << ")");
+        LogError("Error in opendir. Data directory could not be read. Error: " << GetErrnoString(err));
+        return UidVector();
+    }
+
+    size_t len = offsetof(struct dirent, d_name) + pathconf(CKM_DATA_PATH.c_str(), _PC_NAME_MAX) + 1;
+    std::unique_ptr<struct dirent, std::function<void(void*)>>
+        pEntry(static_cast<struct dirent*>(::malloc(len)), ::free);
+
+    if (!pEntry.get()) {
+        LogError("Memory allocation failed.");
         return UidVector();
     }
 
-    struct dirent pPrevDirEntry;
     struct dirent* pDirEntry = NULL;
 
-    while ( (!readdir_r(dirp, &pPrevDirEntry, &pDirEntry)) && pDirEntry ) {
+    while ( (!readdir_r(dirp.get(), pEntry.get(), &pDirEntry)) && pDirEntry ) {
 
         // Ignore files with diffrent prefix
         if (strncmp(pDirEntry->d_name, CKM_KEY_PREFIX.c_str(), CKM_KEY_PREFIX.size())) {
@@ -188,7 +196,6 @@ UidVector FileSystem::getUIDsFromDBFile() {
         }
     }
 
-    closedir(dirp);
     return uids;
 }
 
@@ -199,28 +206,28 @@ int FileSystem::removeUserData() const {
         retCode = -1;
         err = errno;
         LogError("Error in unlink user database: " << getDBPath()
-            << "Errno: " << errno << " " << strerror(err));
+            << "Errno: " << errno << " " << GetErrnoString(err));
     }
 
     if (unlink(getDKEKPath().c_str())) {
         retCode = -1;
         err = errno;
         LogError("Error in unlink user DKEK: " << getDKEKPath()
-            << "Errno: " << errno << " " << strerror(err));
+            << "Errno: " << errno << " " << GetErrnoString(err));
     }
 
     if (unlink(getDBDEKPath().c_str())) {
         retCode = -1;
         err = errno;
         LogError("Error in unlink user DBDEK: " << getDBDEKPath()
-            << "Errno: " << errno << " " << strerror(err));
+            << "Errno: " << errno << " " << GetErrnoString(err));
     }
 
     if (unlink(getRemovedAppsPath().c_str())) {
         retCode = -1;
         err = errno;
         LogError("Error in unlink user's Removed Apps File: " << getRemovedAppsPath()
-            << "Errno: " << errno << " " << strerror(err));
+            << "Errno: " << errno << " " << GetErrnoString(err));
     }
 
     return retCode;