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
This commit is contained in:
Sami Tolvanen 2016-06-17 15:51:03 -07:00
parent d9ff210e63
commit 9af867e7bd
1 changed files with 15 additions and 4 deletions

View File

@ -189,7 +189,7 @@ static int invalidate_table(char *table, size_t table_length)
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);
io->data_size = DM_BUF_SIZE;
@ -792,8 +792,9 @@ out:
int fs_mgr_update_verity_state(fs_mgr_verity_state_callback callback)
{
alignas(dm_ioctl) char buffer[DM_BUF_SIZE];
bool system_root = false;
char fstab_filename[PROPERTY_VALUE_MAX + sizeof(FSTAB_PREFIX)];
char *mount_point;
const char *mount_point;
char propbuf[PROPERTY_VALUE_MAX];
char *status;
int fd = -1;
@ -821,6 +822,9 @@ int fs_mgr_update_verity_state(fs_mgr_verity_state_callback callback)
property_get("ro.hardware", 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);
if (!fstab) {
@ -833,7 +837,12 @@ int fs_mgr_update_verity_state(fs_mgr_verity_state_callback callback)
continue;
}
mount_point = basename(fstab->recs[i].mount_point);
if (system_root && !strcmp(fstab->recs[i].mount_point, "/")) {
mount_point = "system";
} else {
mount_point = basename(fstab->recs[i].mount_point);
}
verity_ioctl_init(io, mount_point, 0);
if (ioctl(fd, DM_TABLE_STATUS, io)) {
@ -844,7 +853,9 @@ int fs_mgr_update_verity_state(fs_mgr_verity_state_callback callback)
status = &buffer[io->data_start + sizeof(struct dm_target_spec)];
callback(&fstab->recs[i], mount_point, mode, *status);
if (*status == 'C' || *status == 'V') {
callback(&fstab->recs[i], mount_point, mode, *status);
}
}
rc = 0;