Merge "Add backup/reserved files in new permission subsystem"

This commit is contained in:
TreeHugger Robot
2023-03-24 05:39:43 +00:00
committed by Android (Google) Code Review
2 changed files with 44 additions and 7 deletions

View File

@@ -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)
}

View File

@@ -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(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.read(block: (FileInputStream) -> Unit) {
openRead().use(block)
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)
}
}
/**