Synchronize on mImsPhone to avoid NPE
Hall Liu [Fri, 5 May 2017 23:23:34 +0000 (16:23 -0700)]
During a disconnect, the binder thread from the IMS stack may set
mImsCall to null simulataneously with the main thread calling methods on
mImsCall after a null check. Adding synchronization to prevent an NPE.

Change-Id: Id7874e802d56ab7d3912c779dedd1cccdb923db6
Test: no deadlocks while calling
Fixes: 37945103

src/java/com/android/internal/telephony/imsphone/ImsPhoneConnection.java

index 9ee5723..3429367 100644 (file)
@@ -410,8 +410,10 @@ public class ImsPhoneConnection extends Connection implements
             } else {
                 Rlog.d(LOG_TAG, "onDisconnect: no parent");
             }
-            if (mImsCall != null) mImsCall.close();
-            mImsCall = null;
+            synchronized (this) {
+                if (mImsCall != null) mImsCall.close();
+                mImsCall = null;
+            }
         }
         releaseWakeLock();
         return changed;
@@ -608,7 +610,7 @@ public class ImsPhoneConnection extends Connection implements
     }
 
     @Override
-    public boolean isMultiparty() {
+    public synchronized boolean isMultiparty() {
         return mImsCall != null && mImsCall.isMultiparty();
     }
 
@@ -621,11 +623,8 @@ public class ImsPhoneConnection extends Connection implements
      *      {@code false} otherwise.
      */
     @Override
-    public boolean isConferenceHost() {
-        if (mImsCall == null) {
-            return false;
-        }
-        return mImsCall.isConferenceHost();
+    public synchronized boolean isConferenceHost() {
+        return mImsCall != null && mImsCall.isConferenceHost();
     }
 
     @Override
@@ -633,11 +632,11 @@ public class ImsPhoneConnection extends Connection implements
         return !isConferenceHost();
     }
 
-    public ImsCall getImsCall() {
+    public synchronized ImsCall getImsCall() {
         return mImsCall;
     }
 
-    public void setImsCall(ImsCall imsCall) {
+    public synchronized void setImsCall(ImsCall imsCall) {
         mImsCall = imsCall;
     }
 
@@ -1007,10 +1006,12 @@ public class ImsPhoneConnection extends Connection implements
         sb.append(" address: ");
         sb.append(Rlog.pii(LOG_TAG, getAddress()));
         sb.append(" ImsCall: ");
-        if (mImsCall == null) {
-            sb.append("null");
-        } else {
-            sb.append(mImsCall);
+        synchronized (this) {
+            if (mImsCall == null) {
+                sb.append("null");
+            } else {
+                sb.append(mImsCall);
+            }
         }
         sb.append("]");
         return sb.toString();