From d0d420587a462024cdf47eee1d22cf6d52a4a6a0 Mon Sep 17 00:00:00 2001 From: Paul Jensen Date: Thu, 7 May 2015 10:44:32 -0400 Subject: [PATCH] Avoid NPE when sendMessage is called after disconnect. This avoids an NPE that could occur when: 1. disconnect() is called 2. sendMessage() is called but encounters a RemoteException 3. replyDisconnected() will attempt to dereference mSrcHandler There does not appear to be any callers that rely on the NPE. All callers erase their reference to the AsyncChannel after calling disconnect(), except for NetworkAgentInfo which can cause ConnectivityService to crash. This fix addresses that. bug:20647016 Change-Id: I89864885dc3371941407a036b7b7647e0ec037b8 --- core/java/com/android/internal/util/AsyncChannel.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/java/com/android/internal/util/AsyncChannel.java b/core/java/com/android/internal/util/AsyncChannel.java index 34f62bac29ea0..bd0e6cef8ae9e 100644 --- a/core/java/com/android/internal/util/AsyncChannel.java +++ b/core/java/com/android/internal/util/AsyncChannel.java @@ -462,10 +462,8 @@ public class AsyncChannel { } catch(Exception e) { } // Tell source we're disconnected. - if (mSrcHandler != null) { - replyDisconnected(STATUS_SUCCESSFUL); - mSrcHandler = null; - } + replyDisconnected(STATUS_SUCCESSFUL); + mSrcHandler = null; // Unlink only when bindService isn't used if (mConnection == null && mDstMessenger != null && mDeathMonitor!= null) { mDstMessenger.getBinder().unlinkToDeath(mDeathMonitor, 0); @@ -871,6 +869,8 @@ public class AsyncChannel { * @param status to be stored in msg.arg1 */ private void replyDisconnected(int status) { + // Can't reply if already disconnected. Avoid NullPointerException. + if (mSrcHandler == null) return; Message msg = mSrcHandler.obtainMessage(CMD_CHANNEL_DISCONNECTED); msg.arg1 = status; msg.obj = this;