Add exception check
[platform/framework/native/channel-service.git] / src / IpcServer.cpp
index 4c171c9..93074cf 100644 (file)
@@ -38,6 +38,8 @@
 
 #include <ipc/ipc_message.h>
 
+#include <app_manager.h>
+
 #include <FBaseRtMutex.h>
 #include <FBaseSysLog.h>
 #include <FBase_StringConverter.h>
@@ -229,7 +231,9 @@ IpcServer::Construct(const String& name, const IIpcServerEventListener& listener
        SysTryCatch(NID_IO, ret == 0, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to change permission of a socket(%d, %s): %s", serverSocket,
                           socketName.c_str(), strerror(errno));
 
-       listen(serverSocket, 15);
+       ret = listen(serverSocket, 128);
+       SysTryCatch(NID_IO, ret == 0, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to listen a socket(%d, %s): %s", serverSocket,
+                          socketName.c_str(), strerror(errno));
 
        pGIOChannel = g_io_channel_unix_new(serverSocket);
        SysTryCatch(NID_IO, pGIOChannel != null, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Not enough memory.");
@@ -286,8 +290,7 @@ CATCH:
 struct HelloMessage
 {
        int pid;
-       bool reverse;  // true if the connection is for reverse message
-       char appId[256];
+       int reverse;  // if the connection is for reverse message
 };
 
 gboolean
@@ -300,6 +303,7 @@ IpcServer::OnConnectionRequest(GIOChannel* source, GIOCondition condition, gpoin
        _ChannelInfo* pChannelInfo = null;
        GSource* pGSource = null;
        GIOChannel* pChannel = null;
+       ssize_t readBytes = 0;
 
        int server = -1;
        int client = -1;
@@ -314,8 +318,9 @@ IpcServer::OnConnectionRequest(GIOChannel* source, GIOCondition condition, gpoin
        client = accept(server, (struct sockaddr*) &clientAddress, &clientLen);
        SysTryCatch(NID_IO, client != -1, , E_SYSTEM, "[E_SYSTEM] Accept failed.");
 
-       read(client, &helloMessage, sizeof(helloMessage));
-       helloMessage.appId[255] = '\0';
+       readBytes = read(client, &helloMessage, sizeof(helloMessage));
+       SysTryCatch(NID_IO, readBytes >= 0, , E_SYSTEM, "[E_SYSTEM] Failed to receive hello message (%d, %s).",
+                       errno, strerror(errno));
 
        pChannel = g_io_channel_unix_new(client);
        SysTryCatch(NID_IO, pChannel != null, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Not enough memory.");
@@ -334,17 +339,23 @@ IpcServer::OnConnectionRequest(GIOChannel* source, GIOCondition condition, gpoin
 
                pClientInfo->pIpcServer = pIpcServer;
                pClientInfo->clientId = helloMessage.pid;
-               pClientInfo->appId.Append((wchar_t*) helloMessage.appId);
+
+               char* pAppId = NULL;
+               int ret = app_manager_get_app_id(helloMessage.pid, &pAppId);
+               SysTryCatch(NID_IO, ret >= 0, delete pClientInfo, E_SYSTEM, "[E_SYSTEM] Failed to get_app_id: %d", ret);
+
+               pClientInfo->appId = pAppId;
+               free(pAppId);
+
                pClientInfo->pReverseChannel = null;
 
                pIpcServer->__clients[helloMessage.pid] = pClientInfo;
-
                pIpcServer->__pCurrentClientInfo = pClientInfo;
                pIpcServer->__pListener->OnIpcClientConnected(*pIpcServer, helloMessage.pid);
                pIpcServer->__pCurrentClientInfo = null;
        }
 
-       if (helloMessage.reverse)
+       if (helloMessage.reverse != 0)
        {
                pClientInfo->pReverseChannel = pChannel;
        }
@@ -686,6 +697,8 @@ IpcServer::Send(IPC::Message* msg)
                // empty statement;
        }
 
+       delete msg;
+
        return true;
 }
 
@@ -698,6 +711,7 @@ IpcServer::SendResponse(int client, IPC::Message* pMessage)
        char* pData = null;
        GError* pGError = null;
        _ClientInfo* pClientInfo = null;
+       int ret = 0;
 
        SysTryReturn(NID_IO, client >= 0 && pMessage != null, false, E_INVALID_ARG,
                                "[E_INVALID_ARG] pMessage(0x%x) is null or clinet(%d) < 0", pMessage,
@@ -715,8 +729,12 @@ IpcServer::SendResponse(int client, IPC::Message* pMessage)
        while (remain > 0)
        {
                pGError = NULL;
-               g_io_channel_write_chars(pClientInfo->pReverseChannel, (char*) pData, remain, &written, &pGError);
-               SysTryCatch(NID_IO, pGError == null, , E_SYSTEM, "[E_SYSTEM] Error occurred during writing message to socket.");
+               ret = g_io_channel_write_chars(pClientInfo->pReverseChannel, (char*) pData, remain, &written, &pGError);
+               if (ret != G_IO_STATUS_NORMAL)
+               {
+                       SysLog(NID_IO, "Failed to send a response: %d", ret);
+                       SysTryCatch(NID_IO, ret != G_IO_STATUS_ERROR, , E_SYSTEM, "[E_SYSTEM] Error occurred during writing message to socket.");
+               }
 
                remain -= written;
                pData += written;
@@ -742,6 +760,7 @@ IpcServer::SendResponse(int client, const IPC::Message& message)
        char* pData = null;
        GError* pGError = null;
        _ClientInfo* pClientInfo = null;
+       int ret = 0;
 
        SysTryReturn(NID_IO, client >= 0, false, E_INVALID_ARG, "[E_INVALID_ARG] clinet(%d) < 0", client);
        SysTryCatch(NID_IO, !message.is_sync(), r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Can't send sync. messagee.");
@@ -757,8 +776,12 @@ IpcServer::SendResponse(int client, const IPC::Message& message)
        while (remain > 0)
        {
                pGError = NULL;
-               g_io_channel_write_chars(pClientInfo->pReverseChannel, (char*) pData, remain, &written, &pGError);
-               SysTryCatch(NID_IO, pGError == null, , E_SYSTEM, "[E_SYSTEM] Error occurred during writing message to socket.");
+               ret = g_io_channel_write_chars(pClientInfo->pReverseChannel, (char*) pData, remain, &written, &pGError);
+               if (ret != G_IO_STATUS_NORMAL)
+               {
+                       SysLog(NID_IO, "Failed to send a response: %d", ret);
+                       SysTryCatch(NID_IO, ret != G_IO_STATUS_ERROR, , E_SYSTEM, "[E_SYSTEM] Error occurred during writing message to socket.");
+               }
 
                remain -= written;
                pData += written;