Protect failed setUidPolicy() and avoid storing invalid UIDs
Add protection for the setUidPolicy() failed case to avoid invalid UIDs
to crash the caller process, and avoid storing the invalid UIDs to
SharedPreferences if it is failed to setUidPolicy()
Bug: 306329984
Test: make -j64 RunSettingsRoboTests ROBOTEST_FILTER="com.android.settings.fuelgauge"
Change-Id: I5c14434708b82ba3c238c2338d47085c2ce244e0
diff --git a/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java b/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java
index 4a25238..15f2094 100644
--- a/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java
+++ b/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java
@@ -95,6 +95,9 @@
/** Suggest a list of package to set as POLICY_REJECT. */
public void setDenylist(Set<Integer> denylistTargetUids) {
+ if (denylistTargetUids == null) {
+ return;
+ }
final Set<Integer> manualDenylistUids = getDenylistAllUids(getManualDenylistPref());
denylistTargetUids.removeAll(manualDenylistUids);
@@ -105,27 +108,40 @@
return;
}
- // Store target denied uids into DynamicDenylistPref.
- final SharedPreferences.Editor editor = getDynamicDenylistPref().edit();
- editor.clear();
- denylistTargetUids.forEach(
- uid -> editor.putInt(String.valueOf(uid), POLICY_REJECT_METERED_BACKGROUND));
- editor.apply();
-
+ final ArraySet<Integer> failedUids = new ArraySet<>();
synchronized (mLock) {
// Set new added UIDs into REJECT policy.
for (int uid : denylistTargetUids) {
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.
for (int uid : lastDynamicDenylistUids) {
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()}. */