Merge tag '1.3.0-RC3' into master 11/20311/2
authorPhilippe Coval <philippe.coval@osg.samsung.com>
Tue, 23 May 2017 08:42:17 +0000 (10:42 +0200)
committerPhilippe Coval <philippe.coval@osg.samsung.com>
Tue, 23 May 2017 16:47:12 +0000 (18:47 +0200)
1.3.0 release candidate RC3

Conflicts:
resource/c_common/octhread/src/posix/octhread.c
resource/c_common/octhread/src/windows/octhread.c
resource/csdk/security/src/credresource.c
run.bat

Change-Id: I56923e53e9b81da45b9ff9e50e7df9cdde233c25
Signed-off-by: Philippe Coval <philippe.coval@osg.samsung.com>
26 files changed:
1  2 
build_common/SConscript
resource/IPCA/unittests/SConscript
resource/c_common/octhread/src/posix/octhread.c
resource/c_common/octhread/src/windows/octhread.c
resource/c_common/platform_features.h
resource/csdk/connectivity/api/cacommon.h
resource/csdk/connectivity/src/adapter_util/ca_adapter_net_ssl.c
resource/csdk/connectivity/src/cainterfacecontroller.c
resource/csdk/connectivity/src/camessagehandler.c
resource/csdk/connectivity/src/ip_adapter/caipserver.c
resource/csdk/connectivity/src/ip_adapter/linux/caipnwmonitor.c
resource/csdk/connectivity/src/tcp_adapter/catcpserver.c
resource/csdk/include/octypes.h
resource/csdk/security/provisioning/src/ocprovisioningmanager.c
resource/csdk/security/provisioning/src/ownershiptransfermanager.c
resource/csdk/security/provisioning/src/secureresourceprovider.c
resource/csdk/security/src/credresource.c
resource/csdk/security/src/crlresource.c
resource/csdk/security/src/doxmresource.c
resource/csdk/stack/src/ocresource.c
resource/csdk/stack/src/ocstack.c
resource/unittests/OCRepresentationTest.cpp
run.bat
service/notification/src/provider/NSProviderNotification.c
service/resource-encapsulation/src/common/SConscript
service/resource-encapsulation/src/serverBuilder/SConscript

Simple merge
Simple merge
@@@ -239,13 -306,23 +302,23 @@@ void oc_mutex_lock(oc_mutex mutex
              exit(ret);
          }
  
 -#ifndef NDEBUG\r
 -        /**\r
 -         * Updating the recursionCount and owner fields must be performed\r
 -         * while owning the lock, to solve race conditions with other\r
 -         * threads using the same lock.\r
 -         */\r
 -        if (mutexInfo->recursionCount != 0)\r
 -        {\r
 -            oc_mutex_assert_owner(mutex, true);\r
 -        }\r
 -        else\r
 -        {\r
 -            mutexInfo->owner = oc_get_current_thread_id();\r
 -        }\r
 -\r
 -        mutexInfo->recursionCount++;\r
 -#endif\r
 +#ifndef NDEBUG
 +        /**
-          * Updating the owner field must be performed while owning the lock,
-          * to solve race conditions with other threads using the same lock.
++         * Updating the recursionCount and owner fields must be performed
++         * while owning the lock, to solve race conditions with other
++         * threads using the same lock.
 +         */
-         mutexInfo->owner = oc_get_current_thread_id();
++        if (mutexInfo->recursionCount != 0)
++        {
++            oc_mutex_assert_owner(mutex, true);
++        }
++        else
++        {
++            mutexInfo->owner = oc_get_current_thread_id();
++        }
++
++        mutexInfo->recursionCount++;
 +#endif
      }
      else
      {
@@@ -258,13 -335,21 +331,21 @@@ void oc_mutex_unlock(oc_mutex mutex
      oc_mutex_internal *mutexInfo = (oc_mutex_internal*) mutex;
      if (mutexInfo)
      {
 -#ifndef NDEBUG\r
 -        oc_mutex_assert_owner(mutex, true);\r
 -\r
 -        /**\r
 -         * Updating the recursionCount and owner fields must be performed\r
 -         * while owning the lock, to solve race conditions with other\r
 -         * threads using the same lock.\r
 -         */\r
 -        mutexInfo->recursionCount--;\r
 -\r
 -        if (mutexInfo->recursionCount == 0)\r
 -        {\r
 -            mutexInfo->owner = OC_INVALID_THREAD_ID;\r
 -        }\r
 -#endif\r
 +#ifndef NDEBUG
++        oc_mutex_assert_owner(mutex, true);
++
 +        /**
-          * Updating the owner field must be performed while owning the lock,
-          * to solve race conditions with other threads using the same lock.
++         * Updating the recursionCount and owner fields must be performed
++         * while owning the lock, to solve race conditions with other
++         * threads using the same lock.
 +         */
-         mutexInfo->owner = OC_INVALID_THREAD_ID;
++        mutexInfo->recursionCount--;
++
++        if (mutexInfo->recursionCount == 0)
++        {
++            mutexInfo->owner = OC_INVALID_THREAD_ID;
++        }
 +#endif
  
          int ret = pthread_mutex_unlock(&mutexInfo->mutex);
          if(ret != 0)
@@@ -487,16 -573,23 +569,23 @@@ OCWaitResult_t oc_cond_wait_for(oc_con
               abstime = oc_get_current_time();
              oc_add_microseconds_to_timespec(&abstime, microseconds);
  
-             // Wait for the given time
 -#ifndef NDEBUG\r
 -            // Recursively-acquired locks are not supported for use with condition variables.\r
 -            oc_mutex_assert_owner(mutex, true);\r
 -            assert(mutexInfo->recursionCount == 1);\r
 -            mutexInfo->recursionCount = 0;\r
 -            mutexInfo->owner = OC_INVALID_THREAD_ID;\r
 -#endif\r
 +#ifndef NDEBUG
-             // The conditional variable wait API used will atomically release the mutex, but the
-             // best we can do here is to just clear the owner info before the API is called.
++            // Recursively-acquired locks are not supported for use with condition variables.
++            oc_mutex_assert_owner(mutex, true);
++            assert(mutexInfo->recursionCount == 1);
++            mutexInfo->recursionCount = 0;
 +            mutexInfo->owner = OC_INVALID_THREAD_ID;
 +#endif
+             // Wait for the given time
              ret = pthread_cond_timedwait(&(eventInfo->cond), &(mutexInfo->mutex), &abstime);
 -#ifndef NDEBUG\r
 -            oc_mutex_assert_owner(mutex, false);\r
 -            assert(mutexInfo->recursionCount == 0);\r
 -            mutexInfo->recursionCount = 1;\r
 -            mutexInfo->owner = oc_get_current_thread_id();\r
 -#endif\r
 +#ifndef NDEBUG
++            oc_mutex_assert_owner(mutex, false);
++            assert(mutexInfo->recursionCount == 0);
++            mutexInfo->recursionCount = 1;
 +            mutexInfo->owner = oc_get_current_thread_id();
 +#endif
          }
  
          switch (ret)
      }
      else
      {
 -#ifndef NDEBUG\r
 -        // Recursively-acquired locks are not supported for use with condition variables.\r
 -        oc_mutex_assert_owner(mutex, true);\r
 -        assert(mutexInfo->recursionCount == 1);\r
 -        mutexInfo->recursionCount = 0;\r
 -        mutexInfo->owner = OC_INVALID_THREAD_ID;\r
 -#endif\r
++#ifndef NDEBUG
++        // Recursively-acquired locks are not supported for use with condition variables.
++        oc_mutex_assert_owner(mutex, true);
++        assert(mutexInfo->recursionCount == 1);
++        mutexInfo->recursionCount = 0;
++        mutexInfo->owner = OC_INVALID_THREAD_ID;
++#endif
          // Wait forever
 +#ifndef NDEBUG
 +        // The conditional variable wait API used will atomically release the mutex, but the
 +        // best we can do here is to just clear the owner info before the API is called.
 +        mutexInfo->owner = OC_INVALID_THREAD_ID;
 +#endif
          int ret = pthread_cond_wait(&eventInfo->cond, &mutexInfo->mutex);
          retVal = (ret == 0) ? OC_WAIT_SUCCESS : OC_WAIT_INVAL;
 -#ifndef NDEBUG\r
 -        oc_mutex_assert_owner(mutex, false);\r
 -        assert(mutexInfo->recursionCount == 0);\r
 -        mutexInfo->recursionCount = 1;\r
 -        mutexInfo->owner = oc_get_current_thread_id();\r
 -#endif\r
 +#ifndef NDEBUG
++        oc_mutex_assert_owner(mutex, false);
++        assert(mutexInfo->recursionCount == 0);
++        mutexInfo->recursionCount = 1;
 +        mutexInfo->owner = oc_get_current_thread_id();
 +#endif
      }
      return retVal;
  }
@@@ -171,13 -182,23 +178,23 @@@ void oc_mutex_lock(oc_mutex mutex
      {
          EnterCriticalSection(&mutexInfo->mutex);
  
 -#ifndef NDEBUG\r
 -        /**\r
 -         * Updating the recursionCount and owner fields must be performed\r
 -         * while owning the lock, to solve race conditions with other\r
 -         * threads using the same lock.\r
 -         */\r
 -        if (mutexInfo->recursionCount != 0)\r
 -        {\r
 -            oc_mutex_assert_owner(mutex, true);\r
 -        }\r
 -        else\r
 -        {\r
 -            mutexInfo->owner = oc_get_current_thread_id();\r
 -        }\r
 -\r
 -        mutexInfo->recursionCount++;\r
 -#endif\r
 +#ifndef NDEBUG
 +        /**
-          * Updating the owner field must be performed while owning the lock,
-          * to solve race conditions with other threads using the same lock.
++         * Updating the recursionCount and owner fields must be performed
++         * while owning the lock, to solve race conditions with other
++         * threads using the same lock.
 +         */
-         mutexInfo->owner = oc_get_current_thread_id();
++        if (mutexInfo->recursionCount != 0)
++        {
++            oc_mutex_assert_owner(mutex, true);
++        }
++        else
++        {
++            mutexInfo->owner = oc_get_current_thread_id();
++        }
++
++        mutexInfo->recursionCount++;
 +#endif
      }
      else
      {
  void oc_mutex_unlock(oc_mutex mutex)
  {
      oc_mutex_internal *mutexInfo = (oc_mutex_internal*) mutex;
      if (mutexInfo)
      {
 -#ifndef NDEBUG\r
 -        oc_mutex_assert_owner(mutex, true);\r
 -\r
 -        /**\r
 -         * Updating the recursionCount and owner fields must be performed\r
 -         * while owning the lock, to solve race conditions with other\r
 -         * threads using the same lock.\r
 -         */\r
 -        mutexInfo->recursionCount--;\r
 -\r
 -        if (mutexInfo->recursionCount == 0)\r
 -        {\r
 -            mutexInfo->owner = OC_INVALID_THREAD_ID;\r
 -        }\r
 -#endif\r
 +#ifndef NDEBUG
++        oc_mutex_assert_owner(mutex, true);
++
 +        /**
-          * Updating the owner field must be performed while owning the lock,
-          * to solve race conditions with other threads using the same lock.
++         * Updating the recursionCount and owner fields must be performed
++         * while owning the lock, to solve race conditions with other
++         * threads using the same lock.
 +         */
-         mutexInfo->owner = OC_INVALID_THREAD_ID;
++        mutexInfo->recursionCount--;
++
++        if (mutexInfo->recursionCount == 0)
++        {
++            mutexInfo->owner = OC_INVALID_THREAD_ID;
++        }
 +#endif
  
          LeaveCriticalSection(&mutexInfo->mutex);
      }
@@@ -317,11 -348,13 +344,13 @@@ OCWaitResult_t oc_cond_wait_for(oc_con
          milli = INFINITE;
      }
  
 -#ifndef NDEBUG\r
 -    // Recursively-acquired locks are not supported for use with condition variables.\r
 -    oc_mutex_assert_owner(mutex, true);\r
 -    assert(mutexInfo->recursionCount == 1);\r
 -    mutexInfo->recursionCount = 0;\r
 -    mutexInfo->owner = OC_INVALID_THREAD_ID;\r
 -#endif\r
 +#ifndef NDEBUG
-     // The conditional variable wait API used will atomically release the mutex, but the
-     // best we can do here is to just clear the owner info before the API is called.
++    // Recursively-acquired locks are not supported for use with condition variables.
++    oc_mutex_assert_owner(mutex, true);
++    assert(mutexInfo->recursionCount == 1);
++    mutexInfo->recursionCount = 0;
 +    mutexInfo->owner = OC_INVALID_THREAD_ID;
 +#endif
  
      // Wait for the given time        
      if (!SleepConditionVariableCS(&eventInfo->cond, &mutexInfo->mutex, milli))
          retVal = OC_WAIT_SUCCESS;
      }
  
 -#ifndef NDEBUG\r
 -    oc_mutex_assert_owner(mutex, false);\r
 -    assert(mutexInfo->recursionCount == 0);\r
 -    mutexInfo->recursionCount = 1;\r
 -    mutexInfo->owner = oc_get_current_thread_id();\r
 -#endif\r
++
 +#ifndef NDEBUG
++    oc_mutex_assert_owner(mutex, false);
++    assert(mutexInfo->recursionCount == 0);
++    mutexInfo->recursionCount = 1;
 +    mutexInfo->owner = oc_get_current_thread_id();
 +#endif
  
      return retVal;
  }
   * UINT16_MAX does not appear to be defined on Arduino so we define it here.
   */
  #  define UINT16_MAX 65535
+ /**
+  * Handle case that PRId64 is not defined in Arduino's inttypes.h
+  */
+ #  if !defined(PRId64)
+ #    define PRId64 "lld"
+ #  endif
  #endif
  
 +/**
 + * Calling convention.
 + */
 +#ifdef _WIN32
 +/*
 + * Set to __stdcall for Windows, consistent with WIN32 APIs.
 + */
 +#  define OC_CALL   __stdcall
 +#else
 +#  define OC_CALL
 +#endif
 +
  /**
   * Mark a parameter as unused. Used to prevent unused variable compiler warnings.
   */
Simple merge
@@@ -3524,9 -3528,9 +3533,10 @@@ void GetDerKey(ByteArray_t * key, cons
                  uint8_t *tmp = OICRealloc(key->data, ctx.buflen);
                  if (NULL == tmp)
                  {
 +                    OIC_LOG(ERROR, TAG, "Failed to allocate memory");
 +                    memset(key->data, 0x0, key->len);
                      OICFree(key->data);
 -                    OIC_LOG(ERROR, TAG, "Failed to allocate memory");
+                     key->data = NULL;
                      mbedtls_pem_free(&ctx);
                      return;
                  }
                  uint8_t *tmp = OICRealloc(key->data, key->len + temp->privateData.len);
                  if (NULL == tmp)
                  {
 +                    OIC_LOG(ERROR, TAG, "Failed to allocate memory");
 +                    memset(key->data, 0x0, key->len);
                      OICFree(key->data);
 -                    OIC_LOG(ERROR, TAG, "Failed to allocate memory");
+                     key->data = NULL;
                      return;
                  }
-                 else
-                 {
-                     key->data = tmp;
-                 }
+                 key->data = tmp;
                  memcpy(key->data + key->len, temp->privateData.data, temp->privateData.len);
                  key->len += temp->privateData.len;
                  OIC_LOG_V(DEBUG, TAG, "Key for %s found", usage);
Simple merge
diff --cc run.bat
+++ b/run.bat
@@@ -123,7 -128,7 +136,8 @@@ IF "%BUILD_MSYS%" == "" 
    set PATH=!PATH!;!BUILD_DIR!;C:\msys64\mingw64\bin
  )
  
- set BUILD_OPTIONS= TARGET_OS=%TARGET_OS% TARGET_ARCH=%TARGET_ARCH% RELEASE=%RELEASE% WITH_RA=0 TARGET_TRANSPORT=IP SECURED=%SECURED% WITH_TCP=%WITH_TCP% BUILD_SAMPLE=ON LOGGING=%LOGGING% LOG_LEVEL=%LOG_LEVEL% TEST=%TEST% RD_MODE=%RD_MODE% ROUTING=%ROUTING% WITH_UPSTREAM_LIBCOAP=%WITH_UPSTREAM_LIBCOAP% MULTIPLE_OWNER=%MULTIPLE_OWNER% -j %THREAD_COUNT% AUTOMATIC_UPDATE=%AUTOMATIC_UPDATE%
 -set BUILD_OPTIONS= TARGET_OS=%TARGET_OS% TARGET_ARCH=%TARGET_ARCH% UWP_APP=%UWP_APP% RELEASE=%RELEASE% WITH_RA=0 TARGET_TRANSPORT=IP SECURED=%SECURED% WITH_TCP=%WITH_TCP% BUILD_SAMPLE=ON LOGGING=%LOGGING% RD_MODE=%RD_MODE% ROUTING=%ROUTING% WITH_UPSTREAM_LIBCOAP=%WITH_UPSTREAM_LIBCOAP% MULTIPLE_OWNER=%MULTIPLE_OWNER% AUTOMATIC_UPDATE=%AUTOMATIC_UPDATE%
++set BUILD_OPTIONS= TARGET_OS=%TARGET_OS% TARGET_ARCH=%TARGET_ARCH% UWP_APP=%UWP_APP% RELEASE=%RELEASE% WITH_RA=0 TARGET_TRANSPORT=IP SECURED=%SECURED% WITH_TCP=%WITH_TCP% BUILD_SAMPLE=ON LOGGING=%LOGGING% LOG_LEVEL=%LOG_LEVEL% TEST=%TEST% RD_MODE=%RD_MODE% ROUTING=%ROUTING% WITH_UPSTREAM_LIBCOAP=%WITH_UPSTREAM_LIBCOAP% MULTIPLE_OWNER=%MULTIPLE_OWNER% -j %THREAD_COUNT% AUTOMATIC_UPDATE=%AUTOMATIC_UPDATE%
++
  
  REM Use MSVC_VERSION=12.0 for VS2013, or MSVC_VERSION=14.0 for VS2015.
  REM If MSVC_VERSION has not been defined here, SCons chooses automatically a VS version.
@@@ -68,10 -68,11 +68,11 @@@ if target_os not in ['darwin', 'ios', '
  if target_os in ['android']:
      server_builder_env.AppendUnique(CXXFLAGS = ['-frtti', '-fexceptions'])
      server_builder_env.PrependUnique(LIBS = ['gnustl_shared', 'log'])
+     server_builder_env.AppendUnique(LINKFLAGS = ['-Wl,-soname,librcs_server.so'])
  
  if server_builder_env.get('SECURED') == '1':
 -      if server_builder_env.get('WITH_TCP') == True:
 -              server_builder_env.AppendUnique(LIBS = ['mbedtls', 'mbedx509', 'mbedcrypto'])
 +    if server_builder_env.get('WITH_TCP') == True:
 +        server_builder_env.AppendUnique(LIBS = ['mbedtls', 'mbedx509', 'mbedcrypto'])
  
  ######################################################################
  # Source files and Targets