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

Commit 9af867e7 authored by Sami Tolvanen's avatar Sami Tolvanen
Browse files

fs_mgr_verity: fix verity_update_state for A/B devices

Use the correct device name when system is mounted as root, and
validate dm-verity status to avoid confusing it with dm-linear.

Bug: 29277442
Change-Id: I36e115189f9a9430bad4bf89f26a376bcb8e8168
parent d9ff210e
Loading
Loading
Loading
Loading
+15 −4
Original line number Original line Diff line number Diff line
@@ -189,7 +189,7 @@ static int invalidate_table(char *table, size_t table_length)
    return -1;
    return -1;
}
}


static void verity_ioctl_init(struct dm_ioctl *io, char *name, unsigned flags)
static void verity_ioctl_init(struct dm_ioctl *io, const char *name, unsigned flags)
{
{
    memset(io, 0, DM_BUF_SIZE);
    memset(io, 0, DM_BUF_SIZE);
    io->data_size = DM_BUF_SIZE;
    io->data_size = DM_BUF_SIZE;
@@ -792,8 +792,9 @@ out:
int fs_mgr_update_verity_state(fs_mgr_verity_state_callback callback)
int fs_mgr_update_verity_state(fs_mgr_verity_state_callback callback)
{
{
    alignas(dm_ioctl) char buffer[DM_BUF_SIZE];
    alignas(dm_ioctl) char buffer[DM_BUF_SIZE];
    bool system_root = false;
    char fstab_filename[PROPERTY_VALUE_MAX + sizeof(FSTAB_PREFIX)];
    char fstab_filename[PROPERTY_VALUE_MAX + sizeof(FSTAB_PREFIX)];
    char *mount_point;
    const char *mount_point;
    char propbuf[PROPERTY_VALUE_MAX];
    char propbuf[PROPERTY_VALUE_MAX];
    char *status;
    char *status;
    int fd = -1;
    int fd = -1;
@@ -821,6 +822,9 @@ int fs_mgr_update_verity_state(fs_mgr_verity_state_callback callback)
    property_get("ro.hardware", propbuf, "");
    property_get("ro.hardware", propbuf, "");
    snprintf(fstab_filename, sizeof(fstab_filename), FSTAB_PREFIX"%s", propbuf);
    snprintf(fstab_filename, sizeof(fstab_filename), FSTAB_PREFIX"%s", propbuf);


    property_get("ro.build.system_root_image", propbuf, "");
    system_root = !strcmp(propbuf, "true");

    fstab = fs_mgr_read_fstab(fstab_filename);
    fstab = fs_mgr_read_fstab(fstab_filename);


    if (!fstab) {
    if (!fstab) {
@@ -833,7 +837,12 @@ int fs_mgr_update_verity_state(fs_mgr_verity_state_callback callback)
            continue;
            continue;
        }
        }


        if (system_root && !strcmp(fstab->recs[i].mount_point, "/")) {
            mount_point = "system";
        } else {
            mount_point = basename(fstab->recs[i].mount_point);
            mount_point = basename(fstab->recs[i].mount_point);
        }

        verity_ioctl_init(io, mount_point, 0);
        verity_ioctl_init(io, mount_point, 0);


        if (ioctl(fd, DM_TABLE_STATUS, io)) {
        if (ioctl(fd, DM_TABLE_STATUS, io)) {
@@ -844,8 +853,10 @@ int fs_mgr_update_verity_state(fs_mgr_verity_state_callback callback)


        status = &buffer[io->data_start + sizeof(struct dm_target_spec)];
        status = &buffer[io->data_start + sizeof(struct dm_target_spec)];


        if (*status == 'C' || *status == 'V') {
            callback(&fstab->recs[i], mount_point, mode, *status);
            callback(&fstab->recs[i], mount_point, mode, *status);
        }
        }
    }


    rc = 0;
    rc = 0;