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

Commit fb45477a authored by Howard Chen's avatar Howard Chen Committed by Automerger Merge Worker
Browse files

Merge changes from topic "cow_pdb" am: 811ad796

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1549486

Change-Id: I73780406caf9ebd6b7134e49c87d0686d406bb71
parents 0680e947 811ad796
Loading
Loading
Loading
Loading
+26 −21
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Binder;
import android.os.FileUtils;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.SystemProperties;
@@ -37,7 +38,6 @@ import com.android.internal.annotations.GuardedBy;

import libcore.io.IoUtils;

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
@@ -45,7 +45,6 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
@@ -105,6 +104,7 @@ import java.util.concurrent.TimeUnit;
public class PersistentDataBlockService extends SystemService {
    private static final String TAG = PersistentDataBlockService.class.getSimpleName();

    private static final String GSI_SANDBOX = "/data/gsi_persistent_data";
    private static final String GSI_RUNNING_PROP = "ro.gsid.image_running";

    private static final String PERSISTENT_DATA_BLOCK_PROP = "ro.frp.pst";
@@ -131,13 +131,13 @@ public class PersistentDataBlockService extends SystemService {
    private static final String FLASH_LOCK_UNLOCKED = "0";

    private final Context mContext;
    private final String mDataBlockFile;
    private final boolean mIsRunningDSU;
    private final Object mLock = new Object();
    private final CountDownLatch mInitDoneSignal = new CountDownLatch(1);

    private int mAllowedUid = -1;
    private long mBlockDeviceSize;
    private String mDataBlockFile;

    @GuardedBy("mLock")
    private boolean mIsWritable = true;
@@ -290,12 +290,18 @@ public class PersistentDataBlockService extends SystemService {
        return true;
    }

    private OutputStream getBlockOutputStream() throws IOException {
        if (mIsRunningDSU) {
            Slog.i(TAG, "data is read-only when running a DSU");
            return new ByteArrayOutputStream();
        } else {
    private FileOutputStream getBlockOutputStream() throws IOException {
        if (!mIsRunningDSU) {
            return new FileOutputStream(new File(mDataBlockFile));
        } else {
            File sandbox = new File(GSI_SANDBOX);
            File realpdb = new File(SystemProperties.get(PERSISTENT_DATA_BLOCK_PROP));
            if (!sandbox.exists()) {
                FileUtils.copy(realpdb, sandbox);
                mDataBlockFile = GSI_SANDBOX;
            }
            Slog.i(TAG, "PersistentDataBlock copy-on-write");
            return new FileOutputStream(sandbox);
        }
    }

@@ -395,13 +401,9 @@ public class PersistentDataBlockService extends SystemService {

    private void doSetOemUnlockEnabledLocked(boolean enabled) {
        FileOutputStream outputStream;
        if (mIsRunningDSU) {
            Slog.i(TAG, "data is read-only when running a DSU");
            return;
        }
        try {
            outputStream = new FileOutputStream(new File(mDataBlockFile));
        } catch (FileNotFoundException e) {
            outputStream = getBlockOutputStream();
        } catch (IOException e) {
            Slog.e(TAG, "partition not available", e);
            return;
        }
@@ -564,7 +566,14 @@ public class PersistentDataBlockService extends SystemService {
            enforceOemUnlockWritePermission();

            if (mIsRunningDSU) {
                Slog.i(TAG, "data is read-only when running a DSU");
                File sandbox = new File(GSI_SANDBOX);
                if (sandbox.exists()) {
                    if (sandbox.delete()) {
                        mDataBlockFile = SystemProperties.get(PERSISTENT_DATA_BLOCK_PROP);
                    } else {
                        Slog.e(TAG, "Failed to wipe sandbox persistent data block");
                    }
                }
                return;
            }
            synchronized (mLock) {
@@ -725,13 +734,9 @@ public class PersistentDataBlockService extends SystemService {

        private void writeDataBuffer(long offset, ByteBuffer dataBuffer) {
            FileOutputStream outputStream;
            if (mIsRunningDSU) {
                Slog.i(TAG, "data is read-only when running a DSU");
                return;
            }
            try {
                outputStream = new FileOutputStream(new File(mDataBlockFile));
            } catch (FileNotFoundException e) {
                outputStream = getBlockOutputStream();
            } catch (IOException e) {
                Slog.e(TAG, "partition not available", e);
                return;
            }