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

Commit ee193879 authored by Andres Morales's avatar Andres Morales
Browse files

Erase PST partition if its marked to be erased.

We need to wipe the challenges on this partition
if OEM unlock is enabled, as this is a signal that
the user has opted out of factory reset protection.

go/factory-reset

Bug: 16633064
Change-Id: Icb8f1433bf99ca57813f5b72d5a3dd15fa94a263
parent a91ecc59
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -659,6 +659,7 @@ wipe_data(int confirm, Device* device) {
    device->WipeData();
    erase_volume("/data");
    erase_volume("/cache");
    erase_persistent_partition();
    ui->Print("Data wipe complete.\n");
}

@@ -959,6 +960,7 @@ main(int argc, char **argv) {
        if (device->WipeData()) status = INSTALL_ERROR;
        if (erase_volume("/data")) status = INSTALL_ERROR;
        if (wipe_cache && erase_volume("/cache")) status = INSTALL_ERROR;
        if (erase_persistent_partition() == -1 ) status = INSTALL_ERROR;
        if (status != INSTALL_SUCCESS) ui->Print("Data wipe failed.\n");
    } else if (wipe_cache) {
        if (wipe_cache && erase_volume("/cache")) status = INSTALL_ERROR;
+37 −0
Original line number Diff line number Diff line
@@ -39,6 +39,8 @@ static struct fstab *fstab = NULL;

extern struct selabel_handle *sehandle;

static const char* PERSISTENT_PATH = "/persistent";

void load_volume_table()
{
    int i;
@@ -264,6 +266,41 @@ int format_volume(const char* volume) {
    return -1;
}

int erase_persistent_partition() {
    Volume *v = volume_for_path(PERSISTENT_PATH);
    if (v == NULL) {
        // most devices won't have /persistent, so this is not an error.
        return 0;
    }

    int fd = open(v->blk_device, O_RDWR);
    uint64_t size = get_file_size(fd);
    if (size == 0) {
        LOGE("failed to stat size of /persistent\n");
        close(fd);
        return -1;
    }

    char oem_unlock_enabled;
    lseek(fd, size - 1, SEEK_SET);
    read(fd, &oem_unlock_enabled, 1);

    if (oem_unlock_enabled) {
        if (wipe_block_device(fd, size)) {
           LOGE("error wiping /persistent: %s\n", strerror(errno));
           close(fd);
           return -1;
        }

        lseek(fd, size - 1, SEEK_SET);
        write(fd, &oem_unlock_enabled, 1);
    }

    close(fd);

    return (int) oem_unlock_enabled;
}

int setup_install_mounts() {
    if (fstab == NULL) {
        LOGE("can't set up install mounts: no fstab loaded\n");
+5 −0
Original line number Diff line number Diff line
@@ -46,6 +46,11 @@ int format_volume(const char* volume);
// mounted (/tmp and /cache) are mounted.  Returns 0 on success.
int setup_install_mounts();

// Conditionally wipes the /persistent partition if it's marked
// to wipe. Returns -1 on failure, 1 if the partition was wiped
// and 0 if the partition was not wiped.
int erase_persistent_partition();

#ifdef __cplusplus
}
#endif