Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7b720288 authored by Jeongsik Mun's avatar Jeongsik Mun Committed by Patrick Baumann
Browse files

Fix the overrides file corruption due to shutdown

The dynamic overrides file could be corrupted by shutdown during
writes. This CL introduces the backup file to avoid corruption.

Test: manual
   1. push a backup file to /data/misc/appcompat/
   2. push a corrupted file to /data/misc/appcompat/
   3. Reboot and see if it reads the backup file
Bug: 196909332
Change-Id: If13547f04a4712ab18dcb97ffee698327797f97b
parent f0a30f66
Loading
Loading
Loading
Loading
+39 −7
Original line number Diff line number Diff line
@@ -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);

        synchronized (mOverridesFileLock) {
            mOverridesFile = dynamicOverridesFile;
        loadOverrides(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) {
        synchronized (mOverridesFileLock) {
            if (mOverridesFile == null || mBackupOverridesFile == null) {
                return;
            }
        synchronized (mOverridesFile) {

            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();
        }
    }