Merge "crash in NSConsumerMsgHandleThreadFunc" into tizen_5.5
authorPyun DoHyun <dh79.pyun@samsung.com>
Sun, 12 Jan 2020 23:04:30 +0000 (23:04 +0000)
committerGerrit Code Review <gerrit@review.ap-northeast-2.compute.internal>
Sun, 12 Jan 2020 23:04:30 +0000 (23:04 +0000)
26 files changed:
auto_build.py
resource/c_common/SConscript
resource/csdk/SConscript
resource/csdk/connectivity/api/cautilinterface.h
resource/csdk/connectivity/common/src/uqueue.c
resource/csdk/connectivity/src/SConscript
resource/csdk/connectivity/src/bt_le_adapter/tizen/caleclient.c [changed mode: 0644->0755]
resource/csdk/connectivity/src/bt_le_adapter/tizen/caleserver_mcd.c
resource/csdk/connectivity/src/ip_adapter/android/caipnwmonitor.c
resource/csdk/connectivity/src/ip_adapter/caipnwmonitor_common.c
resource/csdk/connectivity/src/ip_adapter/caipnwmonitor_common.h
resource/csdk/connectivity/src/ip_adapter/linux/caipnwmonitor.c
resource/csdk/connectivity/src/ip_adapter/tizen/caipnwmonitor.c
resource/csdk/connectivity/src/tcp_adapter/catcpserver.c
resource/csdk/connectivity/util/src/cautilinterface.c
resource/csdk/logger/SConscript
resource/csdk/security/include/internal/aclresource.h
resource/csdk/security/include/securevirtualresourcetypes.h
resource/csdk/security/src/aclresource.c
resource/csdk/stack/include/ocstack.h
resource/csdk/stack/include/octypes.h
resource/csdk/stack/src/ocresource.c
resource/csdk/stack/src/ocstack.c
resource/src/OCDirectPairing.cpp
resource/src/SConscript
tools/generate_report.sh

index 4c1330e..d40bf2f 100644 (file)
@@ -384,12 +384,13 @@ def unit_tests():
     print ("*********** Unit test Start *************")
     build_options = {
                         'RELEASE':'false',
+                        'LOGGING':'true'
                     }
     extra_option_str = "resource -c"
     call_scons(build_options, extra_option_str)
 
     build_options = {
-                        'LOGGING':'false',
+                        'LOGGING':'true',
                         'RELEASE':'false',
                     }
     extra_option_str = "resource"
@@ -398,12 +399,14 @@ def unit_tests():
     build_options = {
                         'TEST':1,
                         'RELEASE':'false',
+                        'LOGGING':'true',
                     }
     call_scons(build_options, extra_option_str)
     build_options = {
                         'TEST':1,
                         'SECURED':1,
                         'RELEASE':'false',
+                        'LOGGING':'true',
                     }
     call_scons(build_options, extra_option_str)
 
index c023903..2228cfe 100755 (executable)
@@ -135,6 +135,10 @@ env.UserInstallTargetHeader(config_h_file_path, 'c_common', 'iotivity_config.h')
 # Use the generated file internally
 env.AppendUnique(CPPPATH = [os.path.join(src_dir, 'resource', 'c_common')])
 
+if not env.get('RELEASE'):
+    env.PrependUnique(LIBS = ['gcov'])
+    env.AppendUnique(CCFLAGS = ['--coverage'])
+
 ######################################################################
 
 ######################################################################
index f12a87a..6bc1eff 100644 (file)
@@ -195,6 +195,10 @@ if with_tcp == True:
        liboctbstack_src.append(OCTBSTACK_SRC + 'oickeepalive.c')
        liboctbstack_env.UserInstallTargetHeader('stack/include/oickeepalive.h', 'resource', 'oickeepalive.h')
 
+if not env.get('RELEASE'):
+    liboctbstack_env.PrependUnique(LIBS = ['gcov'])
+    liboctbstack_env.AppendUnique(CCFLAGS = ['--coverage'])
+
 if 'SERVER' in rd_mode:
     liboctbstack_src.append(OCTBSTACK_SRC + 'oicresourcedirectory.c')
     if target_os not in ['tizen']:
index 59e0315..d11105a 100755 (executable)
@@ -452,6 +452,7 @@ CAResult_t CAUtilStopGattServer();
 #if defined(__TIZEN__)
 CAResult_t CAGetTCPIPHeader(CATransportAdapter_t adapter, int flag, TCPHeaderInfo* info);
 
+#ifdef TCP_ADAPTER
 /**
  * Enables keep-alive on the given endpoint & configures it with user defined values.
  *
@@ -482,6 +483,7 @@ CAResult_t CAUnSetTCPKeepAlive(const CAEndpoint_t *endpoint);
  * @return             - Direct 'errno' value from kernel
  */
 int CAGetTCPLastErrorCode();
+#endif
 
 /**
  * Set the interface to be used for outgoing TCP packets.
index 3124234..17d8298 100644 (file)
@@ -101,7 +101,8 @@ CAResult_t u_queue_add_element(u_queue_t *queue, u_queue_message_t *message)
 
             /* error in queue, free the allocated memory*/
             OICFree(element);
-            return CA_STATUS_FAILED;
+            element = NULL;
+           return CA_STATUS_FAILED;
         }
 
         queue->element = element;
index 0beba71..12e39e9 100644 (file)
@@ -51,6 +51,10 @@ if ca_os not in ['darwin', 'ios', 'windows']:
 if ca_os in ['darwin','ios']:
        env.AppendUnique(CPPDEFINES = ['_DARWIN_C_SOURCE'])
 
+if not env.get('RELEASE'):
+    env.PrependUnique(LIBS = ['gcov'])
+    env.AppendUnique(CCFLAGS = ['--coverage'])
+
 # Getting common source files
 env.SConscript(os.path.join(root_dir, 'common', 'SConscript'))
 
old mode 100644 (file)
new mode 100755 (executable)
index 561e2bf..c13d8e2
@@ -58,7 +58,6 @@ static int g_retrycount = 0;
 static int retry_flag = 0;
 uint64_t const TIMEOUT = 30 * MICROSECS_PER_SEC;
 
-#ifndef TIZEN_VD
 /**
  * Mutex to call connect only after disconnect during retry
  */
@@ -68,7 +67,6 @@ static oc_mutex g_isDisconnectedMutex = NULL;
  * Condition for calling connect during connection retry
  */
 static oc_cond g_LEDisconnectedCond = NULL;
-#endif
 
 /**
  * Flag to check if scanning is in progress
@@ -290,10 +288,8 @@ CAResult_t CALEGattInitiateConnection(const char *remoteAddress)
         return CA_STATUS_FAILED;
     }
     g_isConnectionInProgress = true;
-#ifndef TIZEN_VD
     // Set gatt connect retry count
     g_retrycount = RETRY_COUNT;
-#endif
     oc_mutex_unlock(g_isConnectionInProgressMutex);
 
     // Pause the scanning
@@ -340,11 +336,6 @@ void CALEGattConnectionStateChanged(bool connected, const char *remoteAddress)
     if (!connected)
     {
         OIC_LOG_V(DEBUG, TAG, "DisConnected from [%s] ", remoteAddress);
-#ifdef TIZEN_VD
-        oc_mutex_lock(g_LEServerListMutex);
-        CARemoveLEServerInfoFromList(&g_LEServerList, remoteAddress);
-        oc_mutex_unlock(g_LEServerListMutex);
-#else
         if(!retry_flag)
         {
             oc_mutex_lock(g_LEServerListMutex);
@@ -358,7 +349,6 @@ void CALEGattConnectionStateChanged(bool connected, const char *remoteAddress)
             oc_mutex_unlock(g_isDisconnectedMutex);
         }
         retry_flag = 0;
-#endif
     }
     else
     {
@@ -577,7 +567,6 @@ void CALEAdapterScanResultCb(int result, bt_adapter_le_device_scan_result_info_s
         oc_mutex_unlock(g_LEServerListMutex);
     }
 
-
     OIC_LOG(DEBUG, TAG, "OUT");
 }
 
@@ -941,7 +930,6 @@ CAResult_t CAInitGattClientMutexVariables()
         }
     }
 
-#ifndef TIZEN_VD
     if (NULL == g_isDisconnectedMutex)
     {
         g_isDisconnectedMutex = oc_mutex_new();
@@ -961,7 +949,6 @@ CAResult_t CAInitGattClientMutexVariables()
             return CA_STATUS_FAILED;
         }
     }
-#endif
 
     if (NULL == g_startTimerCond)
     {
@@ -1045,13 +1032,11 @@ void CATerminateGattClientMutexVariables()
     oc_mutex_free(g_threadMTUChangedMutex);
     g_threadMTUChangedMutex = NULL;
 
-#ifndef TIZEN_VD
     oc_mutex_free(g_isDisconnectedMutex);
     g_isDisconnectedMutex = NULL;
 
     oc_cond_free(g_LEDisconnectedCond);
     g_LEDisconnectedCond = NULL;
-#endif
 
     oc_cond_free(g_startTimerCond);
     g_startTimerCond = NULL;
@@ -1321,7 +1306,6 @@ void CADiscoverLEServicesThread(void *remoteAddress)
     OIC_LOG(DEBUG, TAG, "OUT");
 }
 
-#ifndef TIZEN_VD
 static int CALEWaittillDisconnect(oc_mutex mutex, oc_cond cv, int wait_seconds)
 {
     OIC_LOG(DEBUG, TAG, "Waiting for server to be disconnected...");
@@ -1344,7 +1328,6 @@ static CAResult_t CALEGattConnectionRetry(const char *remoteAddress)
     OIC_LOG(DEBUG, TAG, "OUT");
     return result;
 }
-#endif
 
 CAResult_t CALEGattDiscoverServices(const char *remoteAddress)
 {
@@ -1370,9 +1353,7 @@ CAResult_t CALEGattDiscoverServices(const char *remoteAddress)
     {
         OIC_LOG_V(ERROR, TAG,
                   "bt_gatt_client_get_service Failed with ret value [%s] ", CALEGetErrorMsg(ret));
-#ifdef TIZEN_VD
-        goto error_exit;
-#else
+
         if(g_retrycount)
         {
             OIC_LOG(DEBUG, TAG, "Retry will be attempted to connect Gatt Server");
@@ -1387,12 +1368,11 @@ CAResult_t CALEGattDiscoverServices(const char *remoteAddress)
             else
             {
                 oc_mutex_unlock(g_LEServerListMutex);
-               OIC_LOG(ERROR, TAG, "Previous connection attempt failed, attempting to retry again");
-               OIC_LOG_V(DEBUG, TAG, "Retry count left %d time(s)", g_retrycount);
+                OIC_LOG(ERROR, TAG, "Previous connection attempt failed, attempting to retry again");
+                OIC_LOG_V(DEBUG, TAG, "Retry count left %d time(s)", g_retrycount);
                 return CA_STATUS_FAILED;
             }
         }
-#endif
     }
 
     retry_flag = 0;
@@ -1525,6 +1505,7 @@ CAResult_t CAUpdateCharacteristicsToGattServer(const char *remoteAddress,
     }
 
     LEServerInfo *serverInfo = NULL;
+    bool isConnected = false;
     oc_mutex_lock(g_LEServerListMutex);
     if (LE_UNICAST == type)
     {
@@ -1570,28 +1551,72 @@ CAResult_t CAUpdateCharacteristicsToGattServer(const char *remoteAddress,
 
         if(serverInfo->status == LE_STATUS_UNICAST_PENDING)
         {
-            oc_mutex_lock(g_scanMutex);
-            if (!g_isMulticastInProgress && !g_isUnicastScanInProgress)
+
+            int ret = bt_device_is_profile_connected(remoteAddress, BT_PROFILE_GATT, &isConnected);
+            if (BT_ERROR_NONE != ret)
             {
-                CAResult_t result = CALEGattStartDeviceScanning();
-                if (CA_STATUS_OK != result)
+                OIC_LOG_V(ERROR, TAG, "bt_device_is_profile_connected Failed with ret value [%s] ",
+                          CALEGetErrorMsg(ret));
+                oc_mutex_unlock(g_LEServerListMutex);
+                return CA_STATUS_FAILED;
+            }
+
+            if (isConnected){
+                OIC_LOG_V(DEBUG, TAG, "Already connected to address [%s]", remoteAddress);
+                serverInfo->status = LE_STATUS_CONNECTED;
+            } else {
+                oc_mutex_lock(g_scanMutex);
+                if (!g_isMulticastInProgress && !g_isUnicastScanInProgress)
                 {
-                    oc_mutex_unlock(g_scanMutex);
-                    OIC_LOG(ERROR, TAG, "CALEGattStartDeviceScanning failed");
-                    return CA_STATUS_FAILED;
+                    CAResult_t result = CALEGattStartDeviceScanning();
+                    if (CA_STATUS_OK != result)
+                    {
+                        oc_mutex_unlock(g_scanMutex);
+                        OIC_LOG(ERROR, TAG, "CALEGattStartDeviceScanning failed");
+                        oc_mutex_unlock(g_LEServerListMutex);
+                        return CA_STATUS_FAILED;
+                    }
+                    g_isUnicastScanInProgress = true;
+                    // Start Timer
+                    oc_cond_signal(g_startTimerCond);
                 }
-                g_isUnicastScanInProgress = true;
-                // Start Timer
-                oc_cond_signal(g_startTimerCond);
+                else
+                {
+                    g_isUnicastScanInProgress = true;
+                    // Reset Timer
+                    oc_cond_signal(g_scanningTimeCond);
+                }
+                oc_mutex_unlock(g_scanMutex);
+              }
+
+        }
+
+        if (serverInfo->status == LE_STATUS_CONNECTED)
+        {
+            oc_mutex_lock(g_LEClientThreadPoolMutex);
+            if (NULL == g_LEClientThreadPool)
+            {
+                oc_mutex_unlock(g_LEClientThreadPoolMutex);
+                OIC_LOG(ERROR, TAG, "g_LEClientThreadPool is NULL");
+                oc_mutex_unlock(g_LEServerListMutex);
+                return CA_STATUS_FAILED;
             }
-            else
+            char *addr = OICStrdup(remoteAddress);
+            if (NULL == addr)
             {
-                g_isUnicastScanInProgress = true;
-                // Reset Timer
-                oc_cond_signal(g_scanningTimeCond);
+                oc_mutex_unlock(g_LEClientThreadPoolMutex);
+                OIC_LOG(ERROR, TAG, "addr is NULL");
+                oc_mutex_unlock(g_LEServerListMutex);
+                return CA_STATUS_FAILED;
+            }
+            CAResult_t ret = ca_thread_pool_add_task(g_LEClientThreadPool, CADiscoverLEServicesThread,
+                                                     addr, NULL);
+            oc_mutex_unlock(g_LEClientThreadPoolMutex);
+            if (CA_STATUS_OK != ret)
+            {
+                OIC_LOG_V(ERROR, TAG, "ca_thread_pool_add_task failed with ret [%d]", ret);
+                OICFree(addr);
             }
-            oc_mutex_unlock(g_scanMutex);
-
         }
 
         if (serverInfo->status == LE_STATUS_DISCOVERED)
@@ -1610,6 +1635,7 @@ CAResult_t CAUpdateCharacteristicsToGattServer(const char *remoteAddress,
                 OIC_LOG_V(ERROR, TAG,
                           "bt_gatt_client_create Failed with ret value [%s] ", CALEGetErrorMsg(ret));
                 CALEGattDisConnect(serverInfo->remoteAddress);
+                oc_mutex_unlock(g_LEServerListMutex);
                 return CA_STATUS_FAILED;
             }
             serverInfo->clientHandle = clientHandle;
index e9e3d00..362ab6e 100644 (file)
@@ -1200,6 +1200,7 @@ uint16_t CALEServerGetMtuSize(const char* address)
     {
         OIC_LOG_V(ERROR, TAG,
                   "bt_gatt_server_get_device_mtu failed with return [%s]", CALEGetErrorMsg(ret));
+        oc_mutex_unlock(g_LEClientListMutex);
         return CA_DEFAULT_BLE_MTU_SIZE;
     }
 #else
@@ -1237,6 +1238,7 @@ uint16_t CALEServerGetMtuSize(const char* address)
     {
         OIC_LOG_V(ERROR, TAG,
                   "bt_device_get_att_mtu failed with return [%s]", CALEGetErrorMsg(ret));
+        oc_mutex_unlock(g_LEClientListMutex);
         return CA_DEFAULT_BLE_MTU_SIZE;
     }
 #endif // BLE_TIZEN_40
index 05cddc7..50d66de 100644 (file)
@@ -136,12 +136,12 @@ static void CAIPPassNetworkChangesToAdapter(CANetworkStatus_t status)
 CAResult_t CAIPSetNetworkMonitorCallback(CAIPAdapterStateChangeCallback callback,
                                          CATransportAdapter_t adapter)
 {
-    return CAIPSetNetworkMonitorCallbackInternal(callback, adapter, g_adapterCallbackList);
+    return CAIPSetNetworkMonitorCallbackInternal(callback, adapter, &g_adapterCallbackList);
 }
 
 CAResult_t CAIPUnSetNetworkMonitorCallback(CATransportAdapter_t adapter)
 {
-    return CAIPUnSetNetworkMonitorCallbackInternal(adapter, g_adapterCallbackList);
+    return CAIPUnSetNetworkMonitorCallbackInternal(adapter, &g_adapterCallbackList);
 }
 
 u_arraylist_t *CAFindInterfaceChange()
index 1fcb957..9203401 100644 (file)
@@ -54,7 +54,7 @@ void CAIPPassNetworkChangesToAdapterInternal(CANetworkStatus_t status,
 }
 
 CAResult_t CAIPSetNetworkMonitorCallbackInternal(CAIPAdapterStateChangeCallback callback,
-                                         CATransportAdapter_t adapter, CAIPCBData_t *adapterCallbackList)
+                                         CATransportAdapter_t adapter, CAIPCBData_t **adapterCallbackList)
 {
     if (!callback)
     {
@@ -63,7 +63,8 @@ CAResult_t CAIPSetNetworkMonitorCallbackInternal(CAIPAdapterStateChangeCallback
     }
 
     CAIPCBData_t *cbitem = NULL;
-    LL_FOREACH(adapterCallbackList, cbitem)
+    CAIPCBData_t *list = *adapterCallbackList;
+    LL_FOREACH(list, cbitem)
     {
         if (cbitem && adapter == cbitem->adapter && callback == cbitem->callback)
         {
@@ -81,22 +82,25 @@ CAResult_t CAIPSetNetworkMonitorCallbackInternal(CAIPAdapterStateChangeCallback
 
     cbitem->adapter = adapter;
     cbitem->callback = callback;
-    LL_APPEND(adapterCallbackList, cbitem);
+    LL_APPEND(list, cbitem);
+    *adapterCallbackList = list;
 
     return CA_STATUS_OK;
 }
 
 CAResult_t CAIPUnSetNetworkMonitorCallbackInternal(CATransportAdapter_t adapter,
-                                         CAIPCBData_t *adapterCallbackList)
+                                         CAIPCBData_t **adapterCallbackList)
 {
     CAIPCBData_t *cbitem = NULL;
     CAIPCBData_t *tmpCbitem = NULL;
-    LL_FOREACH_SAFE(adapterCallbackList, cbitem, tmpCbitem)
+    CAIPCBData_t *list = *adapterCallbackList;
+    LL_FOREACH_SAFE(list, cbitem, tmpCbitem)
     {
         if (cbitem && adapter == cbitem->adapter)
         {
             OIC_LOG(DEBUG, TAG, "remove specific callback");
-            LL_DELETE(adapterCallbackList, cbitem);
+            LL_DELETE(list, cbitem);
+            *adapterCallbackList = list;
             OICFree(cbitem);
             return CA_STATUS_OK;
         }
index 949d0fa..110c623 100644 (file)
@@ -49,10 +49,10 @@ void CAIPPassNetworkChangesToAdapterInternal(CANetworkStatus_t status,
                                          CAIPCBData_t *adapterCallbackList, CAIPAdapterPlatform_t platform);
 
 CAResult_t CAIPSetNetworkMonitorCallbackInternal(CAIPAdapterStateChangeCallback callback,
-                                         CATransportAdapter_t adapter, CAIPCBData_t *adapterCallbackList);
+                                         CATransportAdapter_t adapter, CAIPCBData_t **adapterCallbackList);
 
 CAResult_t CAIPUnSetNetworkMonitorCallbackInternal(CATransportAdapter_t adapter,
-                                         CAIPCBData_t *adapterCallbackList);
+                                         CAIPCBData_t **adapterCallbackList);
 
 #ifdef __cplusplus
 }
index 39fc257..b93ea8d 100644 (file)
@@ -234,12 +234,12 @@ static void CAIPPassNetworkChangesToAdapter(CANetworkStatus_t status)
 CAResult_t CAIPSetNetworkMonitorCallback(CAIPAdapterStateChangeCallback callback,
                                          CATransportAdapter_t adapter)
 {
-    return CAIPSetNetworkMonitorCallbackInternal(callback, adapter, g_adapterCallbackList);
+    return CAIPSetNetworkMonitorCallbackInternal(callback, adapter, &g_adapterCallbackList);
 }
 
 CAResult_t CAIPUnSetNetworkMonitorCallback(CATransportAdapter_t adapter)
 {
-    return CAIPUnSetNetworkMonitorCallbackInternal(adapter, g_adapterCallbackList);
+    return CAIPUnSetNetworkMonitorCallbackInternal(adapter, &g_adapterCallbackList);
 }
 
 static CAInterface_t *CANewInterfaceItem(int index, const char *name, int family,
index 036b0f1..3486343 100644 (file)
@@ -89,12 +89,12 @@ static void CAIPPassNetworkChangesToAdapter(CANetworkStatus_t status)
 CAResult_t CAIPSetNetworkMonitorCallback(CAIPAdapterStateChangeCallback callback,
                                          CATransportAdapter_t adapter)
 {
-    return CAIPSetNetworkMonitorCallbackInternal(callback, adapter, g_adapterCallbackList);
+    return CAIPSetNetworkMonitorCallbackInternal(callback, adapter, &g_adapterCallbackList);
 }
 
 CAResult_t CAIPUnSetNetworkMonitorCallback(CATransportAdapter_t adapter)
 {
-    return CAIPUnSetNetworkMonitorCallbackInternal(adapter, g_adapterCallbackList);
+    return CAIPUnSetNetworkMonitorCallbackInternal(adapter, &g_adapterCallbackList);
 }
 
 u_arraylist_t *CAFindInterfaceChange()
index 2eb798c..3bfd807 100755 (executable)
@@ -1539,13 +1539,15 @@ CASocketFd_t CAConnectTCPSession(const CAEndpoint_t *endpoint)
 
 CAResult_t CADisconnectTCPSession(size_t index)
 {
+    oc_mutex_lock(g_mutexObjectList);
     CATCPSessionInfo_t *removedData = u_arraylist_remove(caglobals.tcp.svrlist, index);
     if (!removedData)
     {
         OIC_LOG(DEBUG, TAG, "there is no data to be removed");
+        oc_mutex_unlock(g_mutexObjectList);
         return CA_STATUS_OK;
     }
-
+    oc_mutex_unlock(g_mutexObjectList);
     // close the socket and remove session info in list.
     if (removedData->fd >= 0)
     {
@@ -1561,15 +1563,23 @@ CAResult_t CADisconnectTCPSession(size_t index)
             g_connectionCallback(&(removedData->sep.endpoint), false, removedData->isClient);
         }
     }
-    OICFree(removedData->data);
-    removedData->data = NULL;
-
-    OICFree(removedData->tlsdata);
-    removedData->tlsdata = NULL;
+    if (removedData->data)
+    {
+        OICFree(removedData->data);
+        removedData->data = NULL;
+    }
 
-    OICFree(removedData);
-    removedData = NULL;
+    if (removedData->tlsdata)
+    {
+        OICFree(removedData->tlsdata);
+        removedData->tlsdata = NULL;
+    }
 
+    if (removedData)
+    {
+        OICFree(removedData);
+        removedData = NULL;
+    }
     OIC_LOG(DEBUG, TAG, "data is removed from session list");
 
 #ifndef DISABLE_TCP_SERVER
index c8a11bb..c0c9bf7 100644 (file)
@@ -551,6 +551,7 @@ CAResult_t CAGetTCPIPHeader(CATransportAdapter_t adapter, int flag, TCPHeaderInf
     return res;
 }
 
+#ifdef TCP_ADAPTER
 CAResult_t CASetTCPKeepAlive(const CAEndpoint_t *endpoint, int time, int cnt, int intvl)
 {
     OIC_LOG(DEBUG, TAG, "CASetTCPKeepAlive");
@@ -568,5 +569,5 @@ int CAGetTCPLastErrorCode()
     OIC_LOG(DEBUG, TAG, "CAGetTCPLastErrorCode");
     return CATCPGetLastErrorCode();
 }
-
+#endif
 #endif
index e3ae6b8..372562e 100644 (file)
@@ -16,6 +16,10 @@ else:
 if env.get('OIC_SUPPORT_TIZEN_TRACE') == 'True':
     env.AppendUnique(CPPDEFINES = ['OIC_SUPPORT_TIZEN_TRACE'])
 
+if not env.get('RELEASE'):
+    env.PrependUnique(LIBS = ['gcov'])
+    env.AppendUnique(CCFLAGS = ['--coverage'])
+
 env.PrependUnique(LIBS = ['logger'])
 
 local_env = env.Clone()
index 42c75a9..3ba5770 100644 (file)
@@ -191,6 +191,25 @@ void printACL(const OicSecAcl_t* acl);
  */
 OCStackResult CheckSecurityACEPermission(uint16_t permission);
 
+/**
+ * This method add new ACE to ACL
+ *
+ * @param subject of the ACE
+ * @param href resource string
+ * @param rel resource string
+ * @param types string array
+ * @param typeLen string array size
+ * @param interfaces string array
+ * @param interfaceLen string array size
+ * @param permission value
+ *
+ * @return ::OC_STACK_OK for Success, otherwise some error value.
+ */
+OCStackResult AddACE(const OicUuid_t *subject, const char *href, const char *rel,
+                     const char **types, size_t typeLen,
+                     const char **interfaces, size_t interfaceLen,
+                     uint16_t permission);
+
 #ifdef __cplusplus
 }
 #endif
index e6a2f7f..538faf0 100644 (file)
@@ -49,6 +49,8 @@
 #include "byte_array.h"
 #endif /* __WITH_DTLS__  or __WITH_TLS__*/
 
+#include "octypes.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -318,8 +320,6 @@ typedef struct OicSecSacl OicSecSacl_t;
 
 typedef char *OicUrn_t; //TODO is URN type defined elsewhere?
 
-typedef struct OicUuid OicUuid_t; //TODO is UUID type defined elsewhere?
-
 #ifdef MULTIPLE_OWNER
 typedef struct OicSecSubOwner OicSecSubOwner_t;
 typedef struct OicSecMom OicSecMom_t;
@@ -333,22 +333,11 @@ typedef ByteArray_t OicSecCert_t;
 typedef void OicSecCert_t;
 #endif /* __WITH_DTLS__ or __WITH_TLS__*/
 
-/**
- * /oic/uuid (Universal Unique Identifier) data type.
- */
-#define UUID_LENGTH 128/8 // 128-bit GUID length
 //TODO: Confirm the length and type of ROLEID.
 #define ROLEID_LENGTH 128/8 // 128-bit ROLEID length
 #define OWNER_PSK_LENGTH_128 128/8 //byte size of 128-bit key size
 #define OWNER_PSK_LENGTH_256 256/8 //byte size of 256-bit key size
 
-struct OicUuid
-{
-    // <Attribute ID>:<Read/Write>:<Multiple/Single>:<Mandatory?>:<Type>
-    //TODO fill in unless this is defined elsewhere?
-    uint8_t             id[UUID_LENGTH];
-};
-
 /**
  * /oic/sec/jwk (JSON Web Key) data type.
  * See JSON Web Key (JWK)  draft-ietf-jose-json-web-key-41
index b1a3bc8..34b2ed2 100644 (file)
@@ -1149,20 +1149,21 @@ OicSecAcl_t* CBORPayloadToAcl(const uint8_t *cborPayload, const size_t size)
                                                             VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding RT array length.");
                                                         }
 
-                                                        VERIFY_SUCCESS(TAG, (0 != rsrc->typeLen), ERROR);
-
-                                                        rsrc->types = (char**)OICCalloc(rsrc->typeLen, sizeof(char*));
-                                                        VERIFY_NON_NULL(TAG, rsrc->types, ERROR);
+                                                        if (0 != rsrc->typeLen)
+                                                        {
+                                                            rsrc->types = (char**)OICCalloc(rsrc->typeLen, sizeof(char*));
+                                                            VERIFY_NON_NULL(TAG, rsrc->types, ERROR);
 
-                                                        cborFindResult = cbor_value_enter_container(&rMap, &resourceTypes);
-                                                        VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Entering RT Array.");
+                                                            cborFindResult = cbor_value_enter_container(&rMap, &resourceTypes);
+                                                            VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Entering RT Array.");
 
-                                                        for(size_t i = 0; cbor_value_is_valid(&resourceTypes) && cbor_value_is_text_string(&resourceTypes); i++)
-                                                        {
-                                                            cborFindResult = cbor_value_dup_text_string(&resourceTypes, &(rsrc->types[i]), &readLen, NULL);
-                                                            VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding resource type.");
-                                                            cborFindResult = cbor_value_advance(&resourceTypes);
-                                                            VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Advancing resource type.");
+                                                            for(size_t i = 0; cbor_value_is_valid(&resourceTypes) && cbor_value_is_text_string(&resourceTypes); i++)
+                                                            {
+                                                                cborFindResult = cbor_value_dup_text_string(&resourceTypes, &(rsrc->types[i]), &readLen, NULL);
+                                                                VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding resource type.");
+                                                                cborFindResult = cbor_value_advance(&resourceTypes);
+                                                                VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Advancing resource type.");
+                                                            }
                                                         }
                                                     }
 
@@ -1191,20 +1192,21 @@ OicSecAcl_t* CBORPayloadToAcl(const uint8_t *cborPayload, const size_t size)
                                                             VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding IF array length.");
                                                         }
 
-                                                        VERIFY_SUCCESS(TAG, (0 != rsrc->interfaceLen), ERROR);
-
-                                                        rsrc->interfaces = (char**)OICCalloc(rsrc->interfaceLen, sizeof(char*));
-                                                        VERIFY_NON_NULL(TAG, rsrc->interfaces, ERROR);
+                                                        if (0 != rsrc->interfaceLen)
+                                                        {
+                                                            rsrc->interfaces = (char**)OICCalloc(rsrc->interfaceLen, sizeof(char*));
+                                                            VERIFY_NON_NULL(TAG, rsrc->interfaces, ERROR);
 
-                                                        cborFindResult = cbor_value_enter_container(&rMap, &interfaces);
-                                                        VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Entering IF Array.");
+                                                            cborFindResult = cbor_value_enter_container(&rMap, &interfaces);
+                                                            VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Entering IF Array.");
 
-                                                        for(size_t i = 0; cbor_value_is_valid(&interfaces) && cbor_value_is_text_string(&interfaces); i++)
-                                                        {
-                                                            cborFindResult = cbor_value_dup_text_string(&interfaces, &(rsrc->interfaces[i]), &readLen, NULL);
-                                                            VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding IF type.");
-                                                            cborFindResult = cbor_value_advance(&interfaces);
-                                                            VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Advancing IF type.");
+                                                            for(size_t i = 0; cbor_value_is_valid(&interfaces) && cbor_value_is_text_string(&interfaces); i++)
+                                                            {
+                                                                cborFindResult = cbor_value_dup_text_string(&interfaces, &(rsrc->interfaces[i]), &readLen, NULL);
+                                                                VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding IF type.");
+                                                                cborFindResult = cbor_value_advance(&interfaces);
+                                                                VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Advancing IF type.");
+                                                            }
                                                         }
                                                     }
 
@@ -2515,7 +2517,7 @@ void printACL(const OicSecAcl_t* acl)
 
             for (size_t i = 0; i < res->typeLen; i++)
             {
-                OIC_LOG_V(INFO, TAG, "if[%zu] = %s", i, res->types[i]);
+                OIC_LOG_V(INFO, TAG, "rt[%zu] = %s", i, res->types[i]);
             }
             for (size_t i = 0; i < res->interfaceLen; i++)
             {
@@ -2537,6 +2539,8 @@ void printACL(const OicSecAcl_t* acl)
             {
                 OIC_LOG_V(INFO, TAG, "recurrences[%zu] = %s", i, vals->recurrences[i]);
             }
+
+            vals = vals->next;
         }
 
         ace = ace->next;
@@ -2943,3 +2947,106 @@ OCStackResult CheckSecurityACEPermission(uint16_t permission)
     OIC_LOG_V(DEBUG, TAG, "OUT: %s", __func__);
     return ret;
 }
+
+/**
+ * This method add new ACE to ACL
+ *
+ * @param subject of the ACE
+ * @param href resource string
+ * @param rel resource string
+ * @param types string array
+ * @param typeLen string array size
+ * @param interfaces string array
+ * @param interfaceLen string array size
+ * @param permission value
+ *
+ * @return ::OC_STACK_OK for Success, otherwise some error value.
+ */
+OCStackResult AddACE(const OicUuid_t *subject, const char *href, const char *rel,
+                     const char **types, size_t typeLen,
+                     const char **interfaces, size_t interfaceLen,
+                     uint16_t permission)
+{
+    OCStackResult ret = OC_EH_ERROR;
+
+    OIC_LOG_V(DEBUG, TAG, "IN: %s", __func__);
+
+    if (!gAcl)
+    {
+        OIC_LOG_V(ERROR, TAG, "%s: gAcl is NULL", __func__);
+        return OC_STACK_INVALID_PARAM;
+    }
+
+    if (!subject)
+    {
+        OIC_LOG_V(ERROR, TAG, "%s: Invalid Parameter", __func__);
+        return OC_STACK_INVALID_PARAM;
+    }
+
+    OicSecAce_t newAce;
+    OicSecRsrc_t resources;
+    memcpy(&newAce.subjectuuid, subject, sizeof(OicUuid_t));
+    resources.href = href;
+    resources.rel = rel;
+    resources.types = types;
+    resources.typeLen = typeLen;
+    resources.interfaces = interfaces;
+    resources.interfaceLen = interfaceLen;
+    resources.next = NULL;
+    newAce.resources = &resources;
+    newAce.permission = permission;
+    newAce.validities = NULL;
+#ifdef MULTIPLE_OWNER
+    newAce.eownerID = NULL;
+#endif
+    newAce.next = NULL;
+
+    //Check existing ACE's
+    OicSecAce_t *existAce = NULL;
+    OicSecAce_t *tempAce = NULL;
+    LL_FOREACH_SAFE(gAcl->aces, existAce, tempAce)
+    {
+        if (IsSameACE(&newAce, existAce))
+        {
+            OIC_LOG(DEBUG, TAG, "Duplicated ACE dectected.");
+            return OC_STACK_DUPLICATE_REQUEST;
+        }
+    }
+
+    // Add new ACE to ACL
+    OIC_LOG(DEBUG, TAG, "NEW ACE dectected.");
+    OicSecAce_t *insertAce = DuplicateACE(&newAce);
+    if (insertAce)
+    {
+        OIC_LOG(DEBUG, TAG, "Appending new ACE..");
+        LL_APPEND(gAcl->aces, insertAce);
+
+        // Update persistant storage
+        uint8_t *payload = NULL;
+        size_t size = 0;
+        if (OC_STACK_OK == AclToCBORPayload(gAcl, &payload, &size))
+        {
+            if (OC_STACK_OK == UpdateSecureResourceInPS(OIC_JSON_ACL_NAME, payload, size))
+            {
+                ret = OC_STACK_OK;
+            }
+            else
+            {
+                OIC_LOG(ERROR, TAG, "UpdateSecureResourceInPS failed");
+            }
+            OICFree(payload);
+        }
+        else
+        {
+            OIC_LOG(ERROR, TAG, "AclToCBORPayload failed");
+        }
+    }
+    else
+    {
+        OIC_LOG(ERROR, TAG, "Failed to duplicate ACE.");
+    }
+
+    OIC_LOG_V(DEBUG, TAG, "OUT: %s", __func__);
+
+    return ret;
+}
index 0ebe590..b6a3c25 100755 (executable)
@@ -926,6 +926,25 @@ OCStackResult OCSetOtmEventHandler(void *ctx, OCOtmEventHandler cb);
 
 OCStackResult OCGetDeviceOperationalState(bool* isOp);
 
+/**
+ * Helper method to add a new ACE to the ACL
+ *
+ * @param subjectuuid of the ACE
+ * @param href resource string
+ * @param rel resource string
+ * @param types string array
+ * @param typeLen string array size
+ * @param interfaces string array
+ * @param interfaceLen string array size
+ * @param permission value
+ *
+ * @return ::OC_STACK_OK for Success, otherwise some error value.
+ */
+OCStackResult AddACEToACL(const OicUuid_t *subjectuuid, const char *href, const char *rel,
+                          const char **types, size_t typeLen,
+                          const char **interfaces, size_t interfaceLen,
+                          uint16_t permission);
+
 #ifdef __cplusplus
 }
 #endif // __cplusplus
index 128470c..827b4c0 100644 (file)
@@ -1787,6 +1787,15 @@ typedef struct resetSVRDBCB
     ResetSVRDBCB callback;
 } resetSVRDBCB_t;
 
+/**
+ * Universal Unique Identifier data type.
+ */
+#define UUID_LENGTH (128/8) // 128-bit GUID length
+typedef struct OicUuid
+{
+    uint8_t id[UUID_LENGTH];
+} OicUuid_t;
+
 #ifdef __cplusplus
 }
 #endif // __cplusplus
index 287244b..064672b 100644 (file)
@@ -703,6 +703,24 @@ OCStackResult EntityHandlerCodeToOCStackCode(OCEntityHandlerResult ehResult)
         case OC_EH_PROXY_NOT_SUPPORTED:
             result = OC_STACK_PROXY_NOT_SUPPORTED;
             break;
+        case OC_EH_BAD_REQ:
+            result = OC_STACK_INVALID_QUERY;
+            break;
+        case OC_EH_UNAUTHORIZED_REQ:
+            result = OC_STACK_UNAUTHORIZED_REQ;
+            break;
+        case OC_EH_BAD_OPT:
+            result = OC_STACK_INVALID_OPTION;
+            break;
+        case OC_EH_TOO_LARGE:
+            result = OC_STACK_TOO_LARGE_REQ;
+            break;
+        case OC_EH_NOT_ACCEPTABLE:
+            result = OC_STACK_NOT_ACCEPTABLE;
+            break;
+        case OC_EH_METHOD_NOT_ALLOWED:
+            result = OC_STACK_METHOD_NOT_ALLOWED;
+            break;
         default:
             result = OC_STACK_ERROR;
     }
index 4c799b1..ccbdc9b 100644 (file)
@@ -65,6 +65,7 @@
 #include "oicgroup.h"
 #include "pstatresource.h"
 #include "srmutility.h"
+#include "aclresource.h"
 
 #if defined (ROUTING_GATEWAY) || defined (ROUTING_EP)
 #include "routingutility.h"
@@ -5813,3 +5814,26 @@ OCStackResult OCSetOtmEventHandler(void *ctx, OCOtmEventHandler cb)
 #endif
     return OC_STACK_OK;
 }
+
+/**
+ * Helper method to add a new ACE to the ACL
+ *
+ * @param subjectuuid of the ACE
+ * @param href resource string
+ * @param rel resource string
+ * @param types string array
+ * @param typeLen string array size
+ * @param interfaces string array
+ * @param interfaceLen string array size
+ * @param permission value
+ *
+ * @return ::OC_STACK_OK for Success, otherwise some error value.
+ */
+OCStackResult AddACEToACL(const OicUuid_t *subjectuuid, const char *href, const char *rel,
+                          const char **types, size_t typeLen,
+                          const char **interfaces, size_t interfaceLen,
+                          uint16_t permission)
+{
+    return AddACE(subjectuuid, href, rel, types, typeLen,
+                  interfaces, interfaceLen, permission);
+}
index 4e50ac7..b66a300 100644 (file)
@@ -25,7 +25,6 @@ namespace OC
 {
     static const char COAP[] = "coap://";
     static const char COAPS[] = "coaps://";
-    static const int UUID_LENGTH = (128/8); //UUID length
 
     OCDirectPairing::OCDirectPairing(OCDPDev_t *ptr):m_devPtr(ptr)
     {
index 79900ae..70e26f0 100644 (file)
@@ -60,6 +60,10 @@ oclib_env.AppendUnique(LIBPATH = [oclib_env.get('BUILD_DIR')])
 oclib_env.AppendUnique(LIBS = ['oc_logger'])
 oclib_env.PrependUnique(LIBS = ['octbstack', 'connectivity_abstraction', 'ocsrm'])
 
+if not oclib_env.get('RELEASE'):
+    oclib_env.PrependUnique(LIBS = ['gcov'])
+    oclib_env.AppendUnique(CCFLAGS = ['--coverage'])
+
 if 'g++' in oclib_env.get('CXX'):
        oclib_env.AppendUnique(CXXFLAGS = ['-std=c++0x'])
        oclib_env.AppendUnique(CXXFLAGS = ['-Wall'])
index 9d3f533..fbe4961 100644 (file)
@@ -200,6 +200,13 @@ generate_report_CA()
 
     tests_list=(
                 "${IOTIVITY_BASE}/out/${IOTIVITY_TARGET_OS}/${IOTIVITY_TARGET_ARCH}/debug/resource/csdk/connectivity/test/catests"
+                "${IOTIVITY_BASE}/out/${IOTIVITY_TARGET_OS}/${IOTIVITY_TARGET_ARCH}/debug/resource/csdk/stack/test/stacktests"
+                "${IOTIVITY_BASE}/out/${IOTIVITY_TARGET_OS}/${IOTIVITY_TARGET_ARCH}/debug/resource/csdk/stack/test/cbortests"
+                "${IOTIVITY_BASE}/out/${IOTIVITY_TARGET_OS}/${IOTIVITY_TARGET_ARCH}/debug/resource/unittests/unittests"
+                "${IOTIVITY_BASE}/out/${IOTIVITY_TARGET_OS}/${IOTIVITY_TARGET_ARCH}/debug/resource/c_common/ocrandom/test/randomtests"
+                "${IOTIVITY_BASE}/out/${IOTIVITY_TARGET_OS}/${IOTIVITY_TARGET_ARCH}/debug/resource/c_common/oic_malloc/test/malloctests"
+                "${IOTIVITY_BASE}/out/${IOTIVITY_TARGET_OS}/${IOTIVITY_TARGET_ARCH}/debug/resource/c_common/oic_string/test/stringtests"
+                "${IOTIVITY_BASE}/out/${IOTIVITY_TARGET_OS}/${IOTIVITY_TARGET_ARCH}/debug/resource/c_common/oic_time/test/timetests"
                );
 
     for exe in ${tests_list[@]}; do
@@ -472,8 +479,7 @@ generate_report_RE()
 
     tests_list=(
                 "${IOTIVITY_BASE}/out/${IOTIVITY_TARGET_OS}/${IOTIVITY_TARGET_ARCH}/debug/service/resource-encapsulation/src/serverBuilder/rcs_server_test"
-                "${IOTIVITY_BASE}/out/${IOTIVITY_TARGET_OS}/${IOTIVITY_TARGET_ARCH}/debug/service/resource-encapsulation/unittests/rcs_client_test"
-                "${IOTIVITY_BASE}/out/${IOTIVITY_TARGET_OS}/${IOTIVITY_TARGET_ARCH}/debug/service/resource-encapsulation/src/common/primitiveResource/unittests/rcs_common_test"
+                "${IOTIVITY_BASE}/out/${IOTIVITY_TARGET_OS}/${IOTIVITY_TARGET_ARCH}/debug/service/resource-encapsulation/src/common/rcs_common_test"
                 "${IOTIVITY_BASE}/out/${IOTIVITY_TARGET_OS}/${IOTIVITY_TARGET_ARCH}/debug/service/resource-encapsulation/src/resourceCache/unittests/cache_test"
                 "${IOTIVITY_BASE}/out/${IOTIVITY_TARGET_OS}/${IOTIVITY_TARGET_ARCH}/debug/service/resource-encapsulation/src/resourceBroker/unittest/broker_test"
                );