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

Commit acbf9bef authored by Sami Tolvanen's avatar Sami Tolvanen
Browse files

Add init command to set verified properties

Add a command that updates dm-verity state and sets partition.%.verified
properties used by adb remount.

This is needed in init since fs_mgr cannot set properties:
    I6a28cccb1ccce960841af20a4b20c32d424b5524

Change-Id: I0fdf5bc29c56690dcadff9d0eb216d3c68483538
parent b054582b
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -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)];
@@ -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;

@@ -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) {
+9 −5
Original line number Diff line number Diff line
@@ -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,
@@ -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
@@ -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);

@@ -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);
+24 −0
Original line number Diff line number Diff line
@@ -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];
+1 −0
Original line number Diff line number Diff line
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -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,
@@ -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)