Loading fs_mgr/fs_mgr_verity.c +11 −2 Original line number Diff line number Diff line Loading @@ -591,7 +591,7 @@ out: return rc; } int fs_mgr_update_verity_state() int fs_mgr_update_verity_state(fs_mgr_verity_state_callback callback) { _Alignas(struct dm_ioctl) char buffer[DM_BUF_SIZE]; char fstab_filename[PROPERTY_VALUE_MAX + sizeof(FSTAB_PREFIX)]; Loading Loading @@ -645,10 +645,17 @@ int fs_mgr_update_verity_state() if (*status == 'C') { rc = write_verity_state(state_loc, offset, VERITY_MODE_LOGGING); if (rc == -1) { goto out; } } if (callback) { callback(&fstab->recs[i], mount_point, *status); } } /* Don't overwrite possible previous state if there's no corruption. */ rc = 0; Loading Loading @@ -729,6 +736,8 @@ int fs_mgr_setup_verity(struct fstab_rec *fstab) { mode = VERITY_MODE_RESTART; /* default dm-verity mode */ } INFO("Enabling dm-verity for %s (mode %d)\n", mount_point, mode); // load the verity mapping table if (load_verity_table(io, mount_point, fstab->blk_device, fd, verity_table, mode) < 0) { Loading fs_mgr/include/fs_mgr.h +9 −5 Original line number Diff line number Diff line Loading @@ -27,6 +27,10 @@ // turn verity off in userdebug builds. #define VERITY_METADATA_MAGIC_DISABLE 0x46464f56 // "VOFF" #ifdef __cplusplus extern "C" { #endif // Verity modes enum verity_mode { VERITY_MODE_EIO = 0, Loading @@ -35,10 +39,6 @@ enum verity_mode { VERITY_MODE_LAST = VERITY_MODE_RESTART }; #ifdef __cplusplus extern "C" { #endif /* * The entries must be kept in the same order as they were seen in the fstab. * Unless explicitly requested, a lookup on mount point should always Loading Loading @@ -66,6 +66,10 @@ struct fstab_rec { unsigned int zram_size; }; // Callback function for verity status typedef void (*fs_mgr_verity_state_callback)(struct fstab_rec *fstab, const char *mount_point, int status); struct fstab *fs_mgr_read_fstab(const char *fstab_path); void fs_mgr_free_fstab(struct fstab *fstab); Loading @@ -84,7 +88,7 @@ int fs_mgr_unmount_all(struct fstab *fstab); int fs_mgr_get_crypt_info(struct fstab *fstab, char *key_loc, char *real_blk_device, int size); int fs_mgr_load_verity_state(int *mode); int fs_mgr_update_verity_state(); int fs_mgr_update_verity_state(fs_mgr_verity_state_callback callback); int fs_mgr_add_entry(struct fstab *fstab, const char *mount_point, const char *fs_type, const char *blk_device); Loading init/builtins.cpp +24 −0 Original line number Diff line number Diff line Loading @@ -687,6 +687,30 @@ int do_verity_load_state(int nargs, char **args) { return -1; } static void verity_update_property(struct fstab_rec *fstab, const char *mount_point, int status) { char key[PROP_NAME_MAX]; int ret; ret = snprintf(key, PROP_NAME_MAX, "partition.%s.verified", mount_point); if (ret >= PROP_NAME_MAX) { ERROR("Error setting verified property for %s: name too long\n", mount_point); return; } ret = property_set(key, "1"); if (ret < 0) ERROR("Error setting verified property %s: %d\n", key, ret); } int do_verity_update_state(int nargs, char **args) { if (nargs == 1) { return fs_mgr_update_verity_state(verity_update_property); } return -1; } int do_write(int nargs, char **args) { const char *path = args[1]; Loading init/init_parser.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -202,6 +202,7 @@ static int lookup_keyword(const char *s) break; case 'v': if (!strcmp(s, "erity_load_state")) return K_verity_load_state; if (!strcmp(s, "erity_update_state")) return K_verity_update_state; break; case 'w': if (!strcmp(s, "rite")) return K_write; Loading init/keywords.h +2 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ int do_loglevel(int nargs, char **args); int do_load_persist_props(int nargs, char **args); int do_load_all_props(int nargs, char **args); int do_verity_load_state(int nargs, char **args); int do_verity_update_state(int nargs, char **args); int do_wait(int nargs, char **args); #define __MAKE_KEYWORD_ENUM__ #define KEYWORD(symbol, flags, nargs, func) K_##symbol, Loading Loading @@ -89,6 +90,7 @@ enum { KEYWORD(sysclktz, COMMAND, 1, do_sysclktz) KEYWORD(user, OPTION, 0, 0) KEYWORD(verity_load_state, COMMAND, 0, do_verity_load_state) KEYWORD(verity_update_state, COMMAND, 0, do_verity_update_state) KEYWORD(wait, COMMAND, 1, do_wait) KEYWORD(write, COMMAND, 2, do_write) KEYWORD(copy, COMMAND, 2, do_copy) Loading Loading
fs_mgr/fs_mgr_verity.c +11 −2 Original line number Diff line number Diff line Loading @@ -591,7 +591,7 @@ out: return rc; } int fs_mgr_update_verity_state() int fs_mgr_update_verity_state(fs_mgr_verity_state_callback callback) { _Alignas(struct dm_ioctl) char buffer[DM_BUF_SIZE]; char fstab_filename[PROPERTY_VALUE_MAX + sizeof(FSTAB_PREFIX)]; Loading Loading @@ -645,10 +645,17 @@ int fs_mgr_update_verity_state() if (*status == 'C') { rc = write_verity_state(state_loc, offset, VERITY_MODE_LOGGING); if (rc == -1) { goto out; } } if (callback) { callback(&fstab->recs[i], mount_point, *status); } } /* Don't overwrite possible previous state if there's no corruption. */ rc = 0; Loading Loading @@ -729,6 +736,8 @@ int fs_mgr_setup_verity(struct fstab_rec *fstab) { mode = VERITY_MODE_RESTART; /* default dm-verity mode */ } INFO("Enabling dm-verity for %s (mode %d)\n", mount_point, mode); // load the verity mapping table if (load_verity_table(io, mount_point, fstab->blk_device, fd, verity_table, mode) < 0) { Loading
fs_mgr/include/fs_mgr.h +9 −5 Original line number Diff line number Diff line Loading @@ -27,6 +27,10 @@ // turn verity off in userdebug builds. #define VERITY_METADATA_MAGIC_DISABLE 0x46464f56 // "VOFF" #ifdef __cplusplus extern "C" { #endif // Verity modes enum verity_mode { VERITY_MODE_EIO = 0, Loading @@ -35,10 +39,6 @@ enum verity_mode { VERITY_MODE_LAST = VERITY_MODE_RESTART }; #ifdef __cplusplus extern "C" { #endif /* * The entries must be kept in the same order as they were seen in the fstab. * Unless explicitly requested, a lookup on mount point should always Loading Loading @@ -66,6 +66,10 @@ struct fstab_rec { unsigned int zram_size; }; // Callback function for verity status typedef void (*fs_mgr_verity_state_callback)(struct fstab_rec *fstab, const char *mount_point, int status); struct fstab *fs_mgr_read_fstab(const char *fstab_path); void fs_mgr_free_fstab(struct fstab *fstab); Loading @@ -84,7 +88,7 @@ int fs_mgr_unmount_all(struct fstab *fstab); int fs_mgr_get_crypt_info(struct fstab *fstab, char *key_loc, char *real_blk_device, int size); int fs_mgr_load_verity_state(int *mode); int fs_mgr_update_verity_state(); int fs_mgr_update_verity_state(fs_mgr_verity_state_callback callback); int fs_mgr_add_entry(struct fstab *fstab, const char *mount_point, const char *fs_type, const char *blk_device); Loading
init/builtins.cpp +24 −0 Original line number Diff line number Diff line Loading @@ -687,6 +687,30 @@ int do_verity_load_state(int nargs, char **args) { return -1; } static void verity_update_property(struct fstab_rec *fstab, const char *mount_point, int status) { char key[PROP_NAME_MAX]; int ret; ret = snprintf(key, PROP_NAME_MAX, "partition.%s.verified", mount_point); if (ret >= PROP_NAME_MAX) { ERROR("Error setting verified property for %s: name too long\n", mount_point); return; } ret = property_set(key, "1"); if (ret < 0) ERROR("Error setting verified property %s: %d\n", key, ret); } int do_verity_update_state(int nargs, char **args) { if (nargs == 1) { return fs_mgr_update_verity_state(verity_update_property); } return -1; } int do_write(int nargs, char **args) { const char *path = args[1]; Loading
init/init_parser.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -202,6 +202,7 @@ static int lookup_keyword(const char *s) break; case 'v': if (!strcmp(s, "erity_load_state")) return K_verity_load_state; if (!strcmp(s, "erity_update_state")) return K_verity_update_state; break; case 'w': if (!strcmp(s, "rite")) return K_write; Loading
init/keywords.h +2 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ int do_loglevel(int nargs, char **args); int do_load_persist_props(int nargs, char **args); int do_load_all_props(int nargs, char **args); int do_verity_load_state(int nargs, char **args); int do_verity_update_state(int nargs, char **args); int do_wait(int nargs, char **args); #define __MAKE_KEYWORD_ENUM__ #define KEYWORD(symbol, flags, nargs, func) K_##symbol, Loading Loading @@ -89,6 +90,7 @@ enum { KEYWORD(sysclktz, COMMAND, 1, do_sysclktz) KEYWORD(user, OPTION, 0, 0) KEYWORD(verity_load_state, COMMAND, 0, do_verity_load_state) KEYWORD(verity_update_state, COMMAND, 0, do_verity_update_state) KEYWORD(wait, COMMAND, 1, do_wait) KEYWORD(write, COMMAND, 2, do_write) KEYWORD(copy, COMMAND, 2, do_copy) Loading