static int cmdline_append_option(AvbSlotVerifyData* slot_data, const char* key, const char* value) { size_t offset, key_len, value_len; char* new_cmdline; key_len = avb_strlen(key); value_len = avb_strlen(value); offset = 0; if (slot_data->cmdline != NULL) { offset = avb_strlen(slot_data->cmdline); if (offset > 0) { offset += 1; } } new_cmdline = avb_calloc(offset + key_len + value_len + 2); if (new_cmdline == NULL) { return 0; } if (offset > 0) { avb_memcpy(new_cmdline, slot_data->cmdline, offset - 1); new_cmdline[offset - 1] = ' '; } avb_memcpy(new_cmdline + offset, key, key_len); new_cmdline[offset + key_len] = '='; avb_memcpy(new_cmdline + offset + key_len + 1, value, value_len); if (slot_data->cmdline != NULL) { avb_free(slot_data->cmdline); } slot_data->cmdline = new_cmdline; return 1; }
/** * ============================================================================ * AVB2.0 AvbOps alloc/initialisation/free * ============================================================================ */ AvbOps *avb_ops_alloc(int boot_device) { struct AvbOpsData *ops_data; ops_data = avb_calloc(sizeof(struct AvbOpsData)); if (!ops_data) return NULL; ops_data->ops.user_data = ops_data; ops_data->ops.read_from_partition = read_from_partition; ops_data->ops.write_to_partition = write_to_partition; ops_data->ops.validate_vbmeta_public_key = validate_vbmeta_public_key; ops_data->ops.read_rollback_index = read_rollback_index; ops_data->ops.write_rollback_index = write_rollback_index; ops_data->ops.read_is_device_unlocked = read_is_device_unlocked; ops_data->ops.get_unique_guid_for_partition = get_unique_guid_for_partition; ops_data->mmc_dev = boot_device; return &ops_data->ops; }
AvbCmdlineSubstList* avb_new_cmdline_subst_list() { return (AvbCmdlineSubstList*)avb_calloc(sizeof(AvbCmdlineSubstList)); }