From 8fc4ae49386e7f9f47ff8100ebb75fda2f0731aa Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Fri, 8 Nov 2019 16:45:16 -0800 Subject: FocusRequester: fix NPE Fix NPE and potential race condition in FocusRequester.dispatchFocusResultFromExtPolicy where mFocusDispatcher was checked against null, but the method didn't return in that case. Bug: 142278598 Test: Android Auto with phone call and custom focus policy Change-Id: I88447a255132c94f8c2fbf97a1e3ee88f6d2e993 Merged-In: I88447a255132c94f8c2fbf97a1e3ee88f6d2e993 --- .../core/java/com/android/server/audio/FocusRequester.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/audio/FocusRequester.java b/services/core/java/com/android/server/audio/FocusRequester.java index bd129f70ee29..41008c277e4b 100644 --- a/services/core/java/com/android/server/audio/FocusRequester.java +++ b/services/core/java/com/android/server/audio/FocusRequester.java @@ -437,7 +437,8 @@ public class FocusRequester { } int dispatchFocusChange(int focusChange) { - if (mFocusDispatcher == null) { + final IAudioFocusDispatcher fd = mFocusDispatcher; + if (fd == null) { if (MediaFocusControl.DEBUG) { Log.e(TAG, "dispatchFocusChange: no focus dispatcher"); } return AudioManager.AUDIOFOCUS_REQUEST_FAILED; } @@ -457,7 +458,7 @@ public class FocusRequester { mFocusLossReceived = focusChange; } try { - mFocusDispatcher.dispatchAudioFocusChange(focusChange, mClientId); + fd.dispatchAudioFocusChange(focusChange, mClientId); } catch (android.os.RemoteException e) { Log.e(TAG, "dispatchFocusChange: error talking to focus listener " + mClientId, e); return AudioManager.AUDIOFOCUS_REQUEST_FAILED; @@ -466,16 +467,18 @@ public class FocusRequester { } void dispatchFocusResultFromExtPolicy(int requestResult) { - if (mFocusDispatcher == null) { + final IAudioFocusDispatcher fd = mFocusDispatcher; + if (fd == null) { if (MediaFocusControl.DEBUG) { Log.e(TAG, "dispatchFocusResultFromExtPolicy: no focus dispatcher"); } + return; } if (DEBUG) { Log.v(TAG, "dispatching result" + requestResult + " to " + mClientId); } try { - mFocusDispatcher.dispatchFocusResultFromExtPolicy(requestResult, mClientId); + fd.dispatchFocusResultFromExtPolicy(requestResult, mClientId); } catch (android.os.RemoteException e) { Log.e(TAG, "dispatchFocusResultFromExtPolicy: error talking to focus listener" + mClientId, e); -- cgit v1.2.3-59-g8ed1b