Prevent writing to FRP partition during factory reset. am: a9437bd1ca am: 2ce5c4320d

am: 133ff4d611

Change-Id: I54b163f645f561243aac3df1a55c1023531997b3
This commit is contained in:
Charles He
2016-12-29 10:11:20 +00:00
committed by android-build-merger
2 changed files with 19 additions and 6 deletions

View File

@@ -54,6 +54,9 @@ public class PersistentDataBlockManager {
* Returns the number of bytes written or -1 on error. If the block is too big * Returns the number of bytes written or -1 on error. If the block is too big
* to fit on the partition, returns -MAX_BLOCK_SIZE. * to fit on the partition, returns -MAX_BLOCK_SIZE.
* *
* {@link #wipe} will block any further {@link #write} operation until reboot,
* in which case -1 will be returned.
*
* @param data the data to write * @param data the data to write
*/ */
public int write(byte[] data) { public int write(byte[] data) {
@@ -108,6 +111,8 @@ public class PersistentDataBlockManager {
/** /**
* Zeroes the previously written block in its entirety. Calling this method * Zeroes the previously written block in its entirety. Calling this method
* will erase all data written to the persistent data partition. * will erase all data written to the persistent data partition.
* It will also prevent any further {@link #write} operation until reboot,
* in order to prevent a potential race condition. See b/30352311.
*/ */
public void wipe() { public void wipe() {
try { try {

View File

@@ -50,15 +50,14 @@ import java.util.Arrays;
* This data will live across factory resets not initiated via the Settings UI. * This data will live across factory resets not initiated via the Settings UI.
* When a device is factory reset through Settings this data is wiped. * When a device is factory reset through Settings this data is wiped.
* *
* Allows writing one block at a time. Namely, each time * Allows writing one block at a time. Namely, each time {@link IPersistentDataBlockService#write}
* {@link android.service.persistentdata.IPersistentDataBlockService}.write(byte[] data) * is called, it will overwrite the data that was previously written on the block.
* is called, it will overwite the data that was previously written on the block.
* *
* Clients can query the size of the currently written block via * Clients can query the size of the currently written block via
* {@link android.service.persistentdata.IPersistentDataBlockService}.getTotalDataSize(). * {@link IPersistentDataBlockService#getDataBlockSize}
* *
* Clients can any number of bytes from the currently written block up to its total size by invoking * Clients can read any number of bytes from the currently written block up to its total size by
* {@link android.service.persistentdata.IPersistentDataBlockService}.read(byte[] data) * invoking {@link IPersistentDataBlockService#read}
*/ */
public class PersistentDataBlockService extends SystemService { public class PersistentDataBlockService extends SystemService {
private static final String TAG = PersistentDataBlockService.class.getSimpleName(); private static final String TAG = PersistentDataBlockService.class.getSimpleName();
@@ -78,6 +77,7 @@ public class PersistentDataBlockService extends SystemService {
private int mAllowedUid = -1; private int mAllowedUid = -1;
private long mBlockDeviceSize; private long mBlockDeviceSize;
private boolean mIsWritable = true;
public PersistentDataBlockService(Context context) { public PersistentDataBlockService(Context context) {
super(context); super(context);
@@ -349,6 +349,11 @@ public class PersistentDataBlockService extends SystemService {
headerAndData.put(data); headerAndData.put(data);
synchronized (mLock) { synchronized (mLock) {
if (!mIsWritable) {
IoUtils.closeQuietly(outputStream);
return -1;
}
try { try {
byte[] checksum = new byte[DIGEST_SIZE_BYTES]; byte[] checksum = new byte[DIGEST_SIZE_BYTES];
outputStream.write(checksum, 0, DIGEST_SIZE_BYTES); outputStream.write(checksum, 0, DIGEST_SIZE_BYTES);
@@ -423,6 +428,9 @@ public class PersistentDataBlockService extends SystemService {
if (ret < 0) { if (ret < 0) {
Slog.e(TAG, "failed to wipe persistent partition"); Slog.e(TAG, "failed to wipe persistent partition");
} else {
mIsWritable = false;
Slog.i(TAG, "persistent partition now wiped and unwritable");
} }
} }
} }