Correctly get uids for per-app network preferences

Per-app network functionality assumed all apps were installed for user 0
which is not always the case. This fix will address that by checking for
the existance of an app for all users and adding it to the per-app
network preference as was originally intended. Prior, no apps were
included if they were not installed for user 0 even if they were
available for another user such as user 10 in automotive.

Bug: 189838408
Test: atest FrameworksNetTests
atest FrameworksNetIntegrationTests
atest CtsNetTestCases

Change-Id: I7d75cdb02041e7a202254be2eaeca6c2b02d7c29
This commit is contained in:
James Mattis
2021-06-01 22:30:36 -07:00
parent 0a0d7c99c9
commit b6b6a4335a
2 changed files with 47 additions and 41 deletions

View File

@@ -10077,7 +10077,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
private SparseArray<Set<Integer>> createUidsFromOemNetworkPreferences(
@NonNull final OemNetworkPreferences preference) {
final SparseArray<Set<Integer>> uids = new SparseArray<>();
final SparseArray<Set<Integer>> prefToUids = new SparseArray<>();
final PackageManager pm = mContext.getPackageManager();
final List<UserHandle> users =
mContext.getSystemService(UserManager.class).getUserHandles(true);
@@ -10085,29 +10085,29 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (VDBG || DDBG) {
log("No users currently available for setting the OEM network preference.");
}
return uids;
return prefToUids;
}
for (final Map.Entry<String, Integer> entry :
preference.getNetworkPreferences().entrySet()) {
@OemNetworkPreferences.OemNetworkPreference final int pref = entry.getValue();
try {
final int uid = pm.getApplicationInfo(entry.getKey(), 0).uid;
if (!uids.contains(pref)) {
uids.put(pref, new ArraySet<>());
// Add the rules for all users as this policy is device wide.
for (final UserHandle user : users) {
try {
final int uid = pm.getApplicationInfoAsUser(entry.getKey(), 0, user).uid;
if (!prefToUids.contains(pref)) {
prefToUids.put(pref, new ArraySet<>());
}
prefToUids.get(pref).add(uid);
} catch (PackageManager.NameNotFoundException e) {
// Although this may seem like an error scenario, it is ok that uninstalled
// packages are sent on a network preference as the system will watch for
// package installations associated with this network preference and update
// accordingly. This is done to minimize race conditions on app install.
continue;
}
for (final UserHandle ui : users) {
// Add the rules for all users as this policy is device wide.
uids.get(pref).add(ui.getUid(uid));
}
} catch (PackageManager.NameNotFoundException e) {
// Although this may seem like an error scenario, it is ok that uninstalled
// packages are sent on a network preference as the system will watch for
// package installations associated with this network preference and update
// accordingly. This is done so as to minimize race conditions on app install.
continue;
}
}
return uids;
return prefToUids;
}
private NetworkRequestInfo createNriFromOemNetworkPreferences(