Loading services/permission/java/com/android/server/permission/access/AccessPersistence.kt +4 −4 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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") Loading Loading @@ -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) } Loading services/permission/java/com/android/server/permission/access/util/AtomicFileExtensions.kt +40 −3 Original line number Diff line number Diff line Loading @@ -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) } } /** Loading Loading
services/permission/java/com/android/server/permission/access/AccessPersistence.kt +4 −4 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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") Loading Loading @@ -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) } Loading
services/permission/java/com/android/server/permission/access/util/AtomicFileExtensions.kt +40 −3 Original line number Diff line number Diff line Loading @@ -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) } } /** Loading