Exit getAllValidScorers early if not the primary.

This fixes the crash that occurs when getAllValidScorers() is invoked by
a non-primary user when a scorer is active.

BUG: 23040221
Change-Id: I42c9e18d74389be3191258ca5626f2c433ca7cc7
This commit is contained in:
Jeremy Joslin
2015-12-17 17:38:04 -08:00
parent b805bb8b66
commit 5b294b45d0

View File

@@ -33,6 +33,7 @@ import android.util.Log;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.List; import java.util.List;
/** /**
@@ -90,8 +91,13 @@ public final class NetworkScorerAppManager {
* @return the list of scorers, or the empty list if there are no valid scorers. * @return the list of scorers, or the empty list if there are no valid scorers.
*/ */
public static Collection<NetworkScorerAppData> getAllValidScorers(Context context) { public static Collection<NetworkScorerAppData> getAllValidScorers(Context context) {
List<NetworkScorerAppData> scorers = new ArrayList<>(); // Network scorer apps can only run as the primary user so exit early if we're not the
// primary user.
if (UserHandle.getCallingUserId() != 0 /*USER_SYSTEM*/) {
return Collections.emptyList();
}
List<NetworkScorerAppData> scorers = new ArrayList<>();
PackageManager pm = context.getPackageManager(); PackageManager pm = context.getPackageManager();
// Only apps installed under the primary user of the device can be scorers. // Only apps installed under the primary user of the device can be scorers.
List<ResolveInfo> receivers = List<ResolveInfo> receivers =
@@ -104,8 +110,9 @@ public final class NetworkScorerAppManager {
continue; continue;
} }
if (!permission.BROADCAST_NETWORK_PRIVILEGED.equals(receiverInfo.permission)) { if (!permission.BROADCAST_NETWORK_PRIVILEGED.equals(receiverInfo.permission)) {
// Receiver doesn't require the BROADCAST_NETWORK_PRIVILEGED permission, which means // Receiver doesn't require the BROADCAST_NETWORK_PRIVILEGED permission, which
// anyone could trigger network scoring and flood the framework with score requests. // means anyone could trigger network scoring and flood the framework with score
// requests.
continue; continue;
} }
if (pm.checkPermission(permission.SCORE_NETWORKS, receiverInfo.packageName) != if (pm.checkPermission(permission.SCORE_NETWORKS, receiverInfo.packageName) !=
@@ -127,8 +134,8 @@ public final class NetworkScorerAppManager {
} }
} }
// NOTE: loadLabel will attempt to load the receiver's label and fall back to the app // NOTE: loadLabel will attempt to load the receiver's label and fall back to the
// label if none is present. // app label if none is present.
scorers.add(new NetworkScorerAppData(receiverInfo.packageName, scorers.add(new NetworkScorerAppData(receiverInfo.packageName,
receiverInfo.applicationInfo.uid, receiverInfo.loadLabel(pm), receiverInfo.applicationInfo.uid, receiverInfo.loadLabel(pm),
configurationActivityClassName)); configurationActivityClassName));