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

Commit fa6d439a authored by Manjeet Rulhania's avatar Manjeet Rulhania
Browse files

Add backup/reserved files in new permission subsystem

Bug: 274484493
Test: build
Change-Id: Ida3516c1730755a6bf3e636b8818726157c40831
parent 6ba6b754
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -30,9 +30,9 @@ import com.android.modules.utils.BinaryXmlSerializer
import com.android.server.permission.access.collection.* // ktlint-disable no-wildcard-imports
import com.android.server.permission.access.util.PermissionApex
import com.android.server.permission.access.util.parseBinaryXml
import com.android.server.permission.access.util.read
import com.android.server.permission.access.util.readWithReserveCopy
import com.android.server.permission.access.util.serializeBinaryXml
import com.android.server.permission.access.util.writeInlined
import com.android.server.permission.access.util.writeWithReserveCopy
import java.io.File
import java.io.FileNotFoundException

@@ -100,7 +100,7 @@ class AccessPersistence(
     */
    private inline fun File.parse(block: BinaryXmlPullParser.() -> Unit): Boolean =
        try {
            AtomicFile(this).read { it.parseBinaryXml(block) }
            AtomicFile(this).readWithReserveCopy { it.parseBinaryXml(block) }
            true
        } catch (e: FileNotFoundException) {
            Log.i(LOG_TAG, "$this not found")
@@ -179,7 +179,7 @@ class AccessPersistence(

    private inline fun File.serialize(block: BinaryXmlSerializer.() -> Unit) {
        try {
            AtomicFile(this).writeInlined { it.serializeBinaryXml(block) }
            AtomicFile(this).writeWithReserveCopy { it.serializeBinaryXml(block) }
        } catch (e: Exception) {
            Log.e(LOG_TAG, "Failed to serialize $this", e)
        }
+40 −3
Original line number Diff line number Diff line
@@ -16,17 +16,54 @@

package com.android.server.permission.access.util

import android.os.FileUtils
import android.util.AtomicFile
import android.util.Log
import java.io.File
import java.io.FileInputStream
import java.io.FileNotFoundException
import java.io.FileOutputStream
import java.io.IOException

/**
 * Read from an [AtomicFile] and close everything safely when done.
 * Read from an [AtomicFile], fallback to reserve file to read the data.
 */
@Throws(IOException::class)
inline fun AtomicFile.read(block: (FileInputStream) -> Unit) {
@Throws(Exception::class)
inline fun AtomicFile.readWithReserveCopy(block: (FileInputStream) -> Unit) {
    try {
        openRead().use(block)
    } catch (e: FileNotFoundException) {
        throw e
    } catch (e: Exception) {
        Log.wtf("AccessPersistence", "Failed to read $this", e)
        val reserveFile = File(baseFile.parentFile, baseFile.name + ".reservecopy")
        try {
            AtomicFile(reserveFile).openRead().use(block)
        } catch (e2: Exception) {
            Log.e("AccessPersistence", "Failed to read $reserveFile", e2)
            throw e
        }
    }
}

/**
 * Write to actual file and reserve file.
 */
@Throws(IOException::class)
inline fun AtomicFile.writeWithReserveCopy(block: (FileOutputStream) -> Unit) {
    val reserveFile = File(baseFile.parentFile, baseFile.name + ".reservecopy")
    reserveFile.delete()
    writeInlined(block)
    try {
        FileInputStream(baseFile).use { inputStream ->
            FileOutputStream(reserveFile).use { outputStream ->
                FileUtils.copy(inputStream, outputStream)
                outputStream.fd.sync()
            }
        }
    } catch (e: Exception) {
        Log.e("AccessPersistence", "Failed to write $reserveFile", e)
    }
}

/**