From bd39cfaf97106bb8b9ea702d8e1cd5965537da16 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Fri, 17 Feb 2017 17:23:36 -0800 Subject: [PATCH] AudioService: prevent NPE on an invalid PIID When looking for the AudioPlaybackConfiguration to act on a player, check that the PIID is valid. (Note that this is also handled in checkConfigurationCaller()) Test: see bug Bug 35484407 Change-Id: Ic46ad10f9730593f6600175ab3ca8f496cc6d972 --- .../android/server/audio/PlaybackActivityMonitor.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java index 185c778b51971..1f64b65c821c0 100644 --- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java +++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java @@ -106,7 +106,9 @@ public final class PlaybackActivityMonitor synchronized(mPlayerLock) { final AudioPlaybackConfiguration apc = mPlayers.get(new Integer(piid)); // FIXME SoundPool not ready for state reporting - if (apc.getPlayerType() == AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL) { + if (apc != null + && apc.getPlayerType() == AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL) + { return; } if (checkConfigurationCaller(piid, apc, binderUid)) { @@ -278,6 +280,9 @@ public final class PlaybackActivityMonitor while (piidIterator.hasNext()) { final Integer piid = piidIterator.next(); final AudioPlaybackConfiguration apc = mPlayers.get(piid); + if (apc == null) { + continue; + } if (!winner.hasSameUid(apc.getClientUid()) && loser.hasSameUid(apc.getClientUid()) && apc.getPlayerState() == AudioPlaybackConfiguration.PLAYER_STATE_STARTED) @@ -363,6 +368,9 @@ public final class PlaybackActivityMonitor while (piidIterator.hasNext()) { final Integer piid = piidIterator.next(); final AudioPlaybackConfiguration apc = mPlayers.get(piid); + if (apc == null) { + continue; + } final int playerUsage = apc.getAudioAttributes().getUsage(); boolean mute = false; for (int usageToMute : usagesToMute) {