summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Patrick Baumann <patb@google.com> 2021-10-01 16:38:39 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-10-01 16:38:39 +0000
commit8a5d660c41df6f76c8dc13f7c02f9a38c45a273e (patch)
treeaaa34993fc0fc608b0896d8902a1015c314472eb
parent5c846c1d8fa73a80d5e8c2fe58cbb8f3a8717da1 (diff)
parent7b720288b5c1a1259d687c9467f63ddf71e6512a (diff)
Merge "Fix the overrides file corruption due to shutdown"
-rw-r--r--services/core/java/com/android/server/compat/CompatConfig.java46
1 files changed, 39 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/compat/CompatConfig.java b/services/core/java/com/android/server/compat/CompatConfig.java
index 2bf1ccd51939..fb7417084bae 100644
--- a/services/core/java/com/android/server/compat/CompatConfig.java
+++ b/services/core/java/com/android/server/compat/CompatConfig.java
@@ -81,8 +81,11 @@ final class CompatConfig {
private final OverrideValidatorImpl mOverrideValidator;
private final AndroidBuildClassifier mAndroidBuildClassifier;
private Context mContext;
- @GuardedBy("mOverridesFile")
+ private final Object mOverridesFileLock = new Object();
+ @GuardedBy("mOverridesFileLock")
private File mOverridesFile;
+ @GuardedBy("mOverridesFileLock")
+ private File mBackupOverridesFile;
@VisibleForTesting
CompatConfig(AndroidBuildClassifier androidBuildClassifier, Context context) {
@@ -550,8 +553,15 @@ final class CompatConfig {
loadOverrides(staticOverridesFile);
- mOverridesFile = dynamicOverridesFile;
- loadOverrides(dynamicOverridesFile);
+ synchronized (mOverridesFileLock) {
+ mOverridesFile = dynamicOverridesFile;
+ mBackupOverridesFile = makeBackupFile(dynamicOverridesFile);
+ if (mBackupOverridesFile.exists()) {
+ mOverridesFile.delete();
+ mBackupOverridesFile.renameTo(mOverridesFile);
+ }
+ loadOverrides(mOverridesFile);
+ }
if (staticOverridesFile.exists()) {
// Only save overrides if there is a static overrides file.
@@ -559,6 +569,10 @@ final class CompatConfig {
}
}
+ private File makeBackupFile(File overridesFile) {
+ return new File(overridesFile.getPath() + ".bak");
+ }
+
private void loadOverrides(File overridesFile) {
if (!overridesFile.exists()) {
// Overrides file doesn't exist.
@@ -591,10 +605,11 @@ final class CompatConfig {
* Persist compat framework overrides to /data/misc/appcompat/compat_framework_overrides.xml
*/
void saveOverrides() {
- if (mOverridesFile == null) {
- return;
- }
- synchronized (mOverridesFile) {
+ synchronized (mOverridesFileLock) {
+ if (mOverridesFile == null || mBackupOverridesFile == null) {
+ return;
+ }
+
Overrides overrides = new Overrides();
List<ChangeOverrides> changeOverridesList = overrides.getChangeOverrides();
for (CompatChange c : mChanges.values()) {
@@ -603,6 +618,20 @@ final class CompatConfig {
changeOverridesList.add(changeOverrides);
}
}
+
+ // Rename the file to the backup.
+ if (mOverridesFile.exists()) {
+ if (mBackupOverridesFile.exists()) {
+ mOverridesFile.delete();
+ } else {
+ if (!mOverridesFile.renameTo(mBackupOverridesFile)) {
+ Slog.e(TAG, "Couldn't rename file " + mOverridesFile
+ + " to " + mBackupOverridesFile);
+ return;
+ }
+ }
+ }
+
// Create the file if it doesn't already exist
try {
mOverridesFile.createNewFile();
@@ -616,6 +645,9 @@ final class CompatConfig {
} catch (IOException e) {
Slog.e(TAG, e.toString());
}
+
+ // Remove the backup if the write succeeds.
+ mBackupOverridesFile.delete();
}
}