diff options
author | Sami Tolvanen <samitolvanen@google.com> | 2015-04-07 10:02:26 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2015-04-07 10:02:26 +0000 |
commit | 856006047b50e006b067dee9d44f73463cbd452c (patch) | |
tree | 2308c21209ea6f46a7b4142dea45277ceb69cf9d /fs_mgr | |
parent | b52af94a739282e2c0c5f719e19c0fa473e77df7 (diff) | |
parent | 93c4b6c85ac4350029e1a78c16663f61c777ac14 (diff) | |
download | system_core-856006047b50e006b067dee9d44f73463cbd452c.zip system_core-856006047b50e006b067dee9d44f73463cbd452c.tar.gz system_core-856006047b50e006b067dee9d44f73463cbd452c.tar.bz2 |
am 93c4b6c8: am ddaebb24: am 284c5cb2: Merge "Set verity mode as the verified property value"
* commit '93c4b6c85ac4350029e1a78c16663f61c777ac14':
Set verity mode as the verified property value
Diffstat (limited to 'fs_mgr')
-rw-r--r-- | fs_mgr/fs_mgr_verity.c | 66 | ||||
-rw-r--r-- | fs_mgr/include/fs_mgr.h | 2 |
2 files changed, 37 insertions, 31 deletions
diff --git a/fs_mgr/fs_mgr_verity.c b/fs_mgr/fs_mgr_verity.c index acdc5a3..530df26 100644 --- a/fs_mgr/fs_mgr_verity.c +++ b/fs_mgr/fs_mgr_verity.c @@ -594,46 +594,29 @@ out: return rc; } -static int load_verity_state(struct fstab_rec *fstab, int *mode) +static int read_verity_state(const char *fname, off64_t offset, int *mode) { int fd = -1; int rc = -1; - off64_t offset = 0; struct verity_state s; - if (metadata_find(fstab->verity_loc, VERITY_STATE_TAG, sizeof(s), - &offset) < 0) { - /* fall back to stateless behavior */ - *mode = VERITY_MODE_EIO; - rc = 0; - goto out; - } - - if (was_verity_restart()) { - /* device was restarted after dm-verity detected a corrupted - * block, so switch to logging mode */ - *mode = VERITY_MODE_LOGGING; - rc = write_verity_state(fstab->verity_loc, offset, *mode); - goto out; - } - - fd = TEMP_FAILURE_RETRY(open(fstab->verity_loc, O_RDONLY | O_CLOEXEC)); + fd = TEMP_FAILURE_RETRY(open(fname, O_RDONLY | O_CLOEXEC)); if (fd == -1) { - ERROR("Failed to open %s (%s)\n", fstab->verity_loc, strerror(errno)); + ERROR("Failed to open %s (%s)\n", fname, strerror(errno)); goto out; } if (TEMP_FAILURE_RETRY(pread64(fd, &s, sizeof(s), offset)) != sizeof(s)) { ERROR("Failed to read %zu bytes from %s offset %" PRIu64 " (%s)\n", - sizeof(s), fstab->verity_loc, offset, strerror(errno)); + sizeof(s), fname, offset, strerror(errno)); goto out; } if (s.header != VERITY_STATE_HEADER) { /* space allocated, but no state written. write default state */ *mode = VERITY_MODE_DEFAULT; - rc = write_verity_state(fstab->verity_loc, offset, *mode); + rc = write_verity_state(fname, offset, *mode); goto out; } @@ -659,6 +642,27 @@ out: return rc; } +static int load_verity_state(struct fstab_rec *fstab, int *mode) +{ + off64_t offset = 0; + + if (metadata_find(fstab->verity_loc, VERITY_STATE_TAG, + sizeof(struct verity_state), &offset) < 0) { + /* fall back to stateless behavior */ + *mode = VERITY_MODE_EIO; + return 0; + } + + if (was_verity_restart()) { + /* device was restarted after dm-verity detected a corrupted + * block, so switch to logging mode */ + *mode = VERITY_MODE_LOGGING; + return write_verity_state(fstab->verity_loc, offset, *mode); + } + + return read_verity_state(fstab->verity_loc, offset, mode); +} + int fs_mgr_load_verity_state(int *mode) { char fstab_filename[PROPERTY_VALUE_MAX + sizeof(FSTAB_PREFIX)]; @@ -717,6 +721,7 @@ int fs_mgr_update_verity_state(fs_mgr_verity_state_callback callback) char *status; int fd = -1; int i; + int mode; int rc = -1; off64_t offset = 0; struct dm_ioctl *io = (struct dm_ioctl *) buffer; @@ -749,32 +754,33 @@ int fs_mgr_update_verity_state(fs_mgr_verity_state_callback callback) continue; } + if (read_verity_state(fstab->recs[i].verity_loc, offset, &mode) < 0) { + continue; + } + mount_point = basename(fstab->recs[i].mount_point); verity_ioctl_init(io, mount_point, 0); if (ioctl(fd, DM_TABLE_STATUS, io)) { ERROR("Failed to query DM_TABLE_STATUS for %s (%s)\n", mount_point, strerror(errno)); - goto out; + continue; } status = &buffer[io->data_start + sizeof(struct dm_target_spec)]; if (*status == 'C') { - rc = write_verity_state(fstab->recs[i].verity_loc, offset, - VERITY_MODE_LOGGING); - - if (rc == -1) { - goto out; + if (write_verity_state(fstab->recs[i].verity_loc, offset, + VERITY_MODE_LOGGING) < 0) { + continue; } } if (callback) { - callback(&fstab->recs[i], mount_point, *status); + callback(&fstab->recs[i], mount_point, mode, *status); } } - /* Don't overwrite possible previous state if there's no corruption. */ rc = 0; out: diff --git a/fs_mgr/include/fs_mgr.h b/fs_mgr/include/fs_mgr.h index 7e1377d..a1fdf55 100644 --- a/fs_mgr/include/fs_mgr.h +++ b/fs_mgr/include/fs_mgr.h @@ -69,7 +69,7 @@ struct fstab_rec { // Callback function for verity status typedef void (*fs_mgr_verity_state_callback)(struct fstab_rec *fstab, - const char *mount_point, int status); + const char *mount_point, int mode, int status); struct fstab *fs_mgr_read_fstab(const char *fstab_path); void fs_mgr_free_fstab(struct fstab *fstab); |