[IOT-2957] Fix for crash on some Android phones. 59/23959/2
authorLarry Sachs <larry.j.sachs@intel.com>
Thu, 18 Jan 2018 18:17:13 +0000 (10:17 -0800)
committerRick Bell <richard.s.bell@intel.com>
Fri, 19 Jan 2018 22:55:24 +0000 (22:55 +0000)
Some Android phones (LG, HTC) crashed on removing listeners when
compiled WITH_CLOUD=1.  By reversing the order in which the
listeners were removed, the crash does not occur.

Bug: https://jira.iotivity.org/browse/IOT-2957

Change-Id: I32facaaf9a93ad6d0c7125e791c11618aa527587
Signed-off-by: Larry Sachs <larry.j.sachs@intel.com>
java/jni/JniOnDeleteListener.cpp
java/jni/JniOnGetListener.cpp
java/jni/JniOnObserveListener.cpp
java/jni/JniOnPostListener.cpp

index ccaf907..434f930 100644 (file)
@@ -163,14 +163,14 @@ void JniOnDeleteListener::checkExAndRemoveListener(JNIEnv* env)
 #ifndef WITH_CLOUD
         m_ownerResource->removeOnDeleteListener(env, m_jwListener);
 #else
-        if (nullptr != m_ownerResource)
-        {
-            m_ownerResource->removeOnDeleteListener(env, m_jwListener);
-        }
         if (nullptr != m_ownerAccountManager)
         {
             m_ownerAccountManager->removeOnDeleteListener(env, m_jwListener);
         }
+        if (nullptr != m_ownerResource)
+        {
+            m_ownerResource->removeOnDeleteListener(env, m_jwListener);
+        }
 #endif
         env->Throw((jthrowable)ex);
     }
@@ -179,14 +179,14 @@ void JniOnDeleteListener::checkExAndRemoveListener(JNIEnv* env)
 #ifndef WITH_CLOUD
         m_ownerResource->removeOnDeleteListener(env, m_jwListener);
 #else
-        if (nullptr != m_ownerResource)
-        {
-            m_ownerResource->removeOnDeleteListener(env, m_jwListener);
-        }
         if (nullptr != m_ownerAccountManager)
         {
             m_ownerAccountManager->removeOnDeleteListener(env, m_jwListener);
         }
+        if (nullptr != m_ownerResource)
+        {
+            m_ownerResource->removeOnDeleteListener(env, m_jwListener);
+        }
 #endif
     }
 }
index c5092bf..a9c2151 100644 (file)
@@ -189,14 +189,14 @@ void JniOnGetListener::checkExAndRemoveListener(JNIEnv* env)
 #ifndef WITH_CLOUD
         m_ownerResource->removeOnGetListener(env, m_jwListener);
 #else
-        if (nullptr != m_ownerResource)
-        {
-            m_ownerResource->removeOnGetListener(env, m_jwListener);
-        }
         if (nullptr != m_ownerAccountManager)
         {
             m_ownerAccountManager->removeOnGetListener(env, m_jwListener);
         }
+        if (nullptr != m_ownerResource)
+        {
+            m_ownerResource->removeOnGetListener(env, m_jwListener);
+        }
 #endif
         env->Throw((jthrowable)ex);
     }
@@ -205,14 +205,14 @@ void JniOnGetListener::checkExAndRemoveListener(JNIEnv* env)
 #ifndef WITH_CLOUD
         m_ownerResource->removeOnGetListener(env, m_jwListener);
 #else
-        if (nullptr != m_ownerResource)
-        {
-            m_ownerResource->removeOnGetListener(env, m_jwListener);
-        }
         if (nullptr != m_ownerAccountManager)
         {
             m_ownerAccountManager->removeOnGetListener(env, m_jwListener);
         }
+        if (nullptr != m_ownerResource)
+        {
+            m_ownerResource->removeOnGetListener(env, m_jwListener);
+        }
 #endif
     }
 }
index 303a469..1a7c54f 100644 (file)
@@ -171,14 +171,14 @@ void JniOnObserveListener::onObserveCallback(const HeaderOptions headerOptions,
 #ifndef WITH_CLOUD
             m_ownerResource->removeOnObserveListener(env, m_jwListener);
 #else
-            if (nullptr != m_ownerResource)
-            {
-                m_ownerResource->removeOnObserveListener(env, m_jwListener);
-            }
             if (nullptr != m_ownerAccountManager)
             {
                 m_ownerAccountManager->removeOnObserveListener(env, m_jwListener);
             }
+            if (nullptr != m_ownerResource)
+            {
+                m_ownerResource->removeOnObserveListener(env, m_jwListener);
+            }
 #endif
             env->Throw((jthrowable)ex);
         }
@@ -218,14 +218,14 @@ void JniOnObserveListener::checkExAndRemoveListener(JNIEnv* env)
 #ifndef WITH_CLOUD
         m_ownerResource->removeOnObserveListener(env, m_jwListener);
 #else
-        if (nullptr != m_ownerResource)
-        {
-            m_ownerResource->removeOnObserveListener(env, m_jwListener);
-        }
         if (nullptr != m_ownerAccountManager)
         {
             m_ownerAccountManager->removeOnObserveListener(env, m_jwListener);
         }
+        if (nullptr != m_ownerResource)
+        {
+            m_ownerResource->removeOnObserveListener(env, m_jwListener);
+        }
 #endif
         env->Throw((jthrowable)ex);
     }
@@ -234,14 +234,14 @@ void JniOnObserveListener::checkExAndRemoveListener(JNIEnv* env)
 #ifndef WITH_CLOUD
         m_ownerResource->removeOnObserveListener(env, m_jwListener);
 #else
-        if (nullptr != m_ownerResource)
-        {
-            m_ownerResource->removeOnObserveListener(env, m_jwListener);
-        }
         if (nullptr != m_ownerAccountManager)
         {
             m_ownerAccountManager->removeOnObserveListener(env, m_jwListener);
         }
+        if (nullptr != m_ownerResource)
+        {
+            m_ownerResource->removeOnObserveListener(env, m_jwListener);
+        }
 #endif
     }
 }
index a800c52..c9c9b76 100644 (file)
@@ -188,14 +188,14 @@ void JniOnPostListener::checkExAndRemoveListener(JNIEnv* env)
 #ifndef WITH_CLOUD
         m_ownerResource->removeOnPostListener(env, m_jwListener);
 #else
-        if (nullptr != m_ownerResource)
-        {
-            m_ownerResource->removeOnPostListener(env, m_jwListener);
-        }
         if (nullptr != m_ownerAccountManager)
         {
             m_ownerAccountManager->removeOnPostListener(env, m_jwListener);
         }
+        if (nullptr != m_ownerResource)
+        {
+            m_ownerResource->removeOnPostListener(env, m_jwListener);
+        }
 #endif
         env->Throw((jthrowable)ex);
     }
@@ -204,14 +204,14 @@ void JniOnPostListener::checkExAndRemoveListener(JNIEnv* env)
 #ifndef WITH_CLOUD
         m_ownerResource->removeOnPostListener(env, m_jwListener);
 #else
-        if (nullptr != m_ownerResource)
-        {
-            m_ownerResource->removeOnPostListener(env, m_jwListener);
-        }
         if (nullptr != m_ownerAccountManager)
         {
             m_ownerAccountManager->removeOnPostListener(env, m_jwListener);
         }
+        if (nullptr != m_ownerResource)
+        {
+            m_ownerResource->removeOnPostListener(env, m_jwListener);
+        }
 #endif
     }
 }