Merge "Protect failed setUidPolicy() and avoid storing invalid UIDs" into main

This commit is contained in:
YK Hung
2023-11-29 10:56:45 +00:00
committed by Android (Google) Code Review

View File

@@ -95,6 +95,9 @@ public final class DynamicDenylistManager {
/** Suggest a list of package to set as POLICY_REJECT. */ /** Suggest a list of package to set as POLICY_REJECT. */
public void setDenylist(Set<Integer> denylistTargetUids) { public void setDenylist(Set<Integer> denylistTargetUids) {
if (denylistTargetUids == null) {
return;
}
final Set<Integer> manualDenylistUids = getDenylistAllUids(getManualDenylistPref()); final Set<Integer> manualDenylistUids = getDenylistAllUids(getManualDenylistPref());
denylistTargetUids.removeAll(manualDenylistUids); denylistTargetUids.removeAll(manualDenylistUids);
@@ -105,27 +108,40 @@ public final class DynamicDenylistManager {
return; return;
} }
// Store target denied uids into DynamicDenylistPref. final ArraySet<Integer> failedUids = new ArraySet<>();
final SharedPreferences.Editor editor = getDynamicDenylistPref().edit();
editor.clear();
denylistTargetUids.forEach(
uid -> editor.putInt(String.valueOf(uid), POLICY_REJECT_METERED_BACKGROUND));
editor.apply();
synchronized (mLock) { synchronized (mLock) {
// Set new added UIDs into REJECT policy. // Set new added UIDs into REJECT policy.
for (int uid : denylistTargetUids) { for (int uid : denylistTargetUids) {
if (!lastDynamicDenylistUids.contains(uid)) { if (!lastDynamicDenylistUids.contains(uid)) {
mNetworkPolicyManager.setUidPolicy(uid, POLICY_REJECT_METERED_BACKGROUND); try {
mNetworkPolicyManager.setUidPolicy(uid, POLICY_REJECT_METERED_BACKGROUND);
} catch (Exception e) {
Log.e(TAG, "failed to setUidPolicy(REJECT) for " + uid, e);
failedUids.add(uid);
}
} }
} }
// Unset removed UIDs back to NONE policy. // Unset removed UIDs back to NONE policy.
for (int uid : lastDynamicDenylistUids) { for (int uid : lastDynamicDenylistUids) {
if (!denylistTargetUids.contains(uid)) { if (!denylistTargetUids.contains(uid)) {
mNetworkPolicyManager.setUidPolicy(uid, POLICY_NONE); try {
mNetworkPolicyManager.setUidPolicy(uid, POLICY_NONE);
} catch (Exception e) {
Log.e(TAG, "failed to setUidPolicy(NONE) for " + uid, e);
}
} }
} }
} }
// Store target denied uids into DynamicDenylistPref.
final SharedPreferences.Editor editor = getDynamicDenylistPref().edit();
editor.clear();
denylistTargetUids.forEach(uid -> {
if (!failedUids.contains(uid)) {
editor.putInt(String.valueOf(uid), POLICY_REJECT_METERED_BACKGROUND);
}
});
editor.apply();
} }
/** Return true if the target uid is in {@link #getManualDenylistPref()}. */ /** Return true if the target uid is in {@link #getManualDenylistPref()}. */