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

Commit 32df92db authored by Sami Tolvanen's avatar Sami Tolvanen
Browse files

UPSTREAM: dm verity: separate function for parsing opt args



(cherry-picked from 753c1fd02807cb43a1c5d01d75d454054d46bdad)

Move optional argument parsing into a separate function to make it
easier to add more of them without making verity_ctr even longer.

Bug: 21893453
Change-Id: I61ab0a659fdbd67acb8f04bc43f14b9613f7a0a8
Signed-off-by: default avatarSami Tolvanen <samitolvanen@google.com>
Reviewed-by: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent cfb1f868
Loading
Loading
Loading
Loading
+43 −28
Original line number Original line Diff line number Diff line
@@ -34,6 +34,8 @@
#define DM_VERITY_OPT_LOGGING		"ignore_corruption"
#define DM_VERITY_OPT_LOGGING		"ignore_corruption"
#define DM_VERITY_OPT_RESTART		"restart_on_corruption"
#define DM_VERITY_OPT_RESTART		"restart_on_corruption"


#define DM_VERITY_OPTS_MAX		1

static unsigned dm_verity_prefetch_cluster = DM_VERITY_DEFAULT_PREFETCH_SIZE;
static unsigned dm_verity_prefetch_cluster = DM_VERITY_DEFAULT_PREFETCH_SIZE;


module_param_named(prefetch_cluster, dm_verity_prefetch_cluster, uint, S_IRUGO | S_IWUSR);
module_param_named(prefetch_cluster, dm_verity_prefetch_cluster, uint, S_IRUGO | S_IWUSR);
@@ -739,6 +741,44 @@ static void verity_dtr(struct dm_target *ti)
	kfree(v);
	kfree(v);
}
}


static int verity_parse_opt_args(struct dm_arg_set *as, struct dm_verity *v)
{
	int r;
	unsigned argc;
	struct dm_target *ti = v->ti;
	const char *arg_name;

	static struct dm_arg _args[] = {
		{0, DM_VERITY_OPTS_MAX, "Invalid number of feature args"},
	};

	r = dm_read_arg_group(_args, as, &argc, &ti->error);
	if (r)
		return -EINVAL;

	if (!argc)
		return 0;

	do {
		arg_name = dm_shift_arg(as);
		argc--;

		if (!strcasecmp(arg_name, DM_VERITY_OPT_LOGGING)) {
			v->mode = DM_VERITY_MODE_LOGGING;
			continue;

		} else if (!strcasecmp(arg_name, DM_VERITY_OPT_RESTART)) {
			v->mode = DM_VERITY_MODE_RESTART;
			continue;
		}

		ti->error = "Unrecognized verity feature request";
		return -EINVAL;
	} while (argc && !r);

	return r;
}

/*
/*
 * Target parameters:
 * Target parameters:
 *	<version>	The current format is version 1.
 *	<version>	The current format is version 1.
@@ -757,18 +797,13 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv)
{
{
	struct dm_verity *v;
	struct dm_verity *v;
	struct dm_arg_set as;
	struct dm_arg_set as;
	const char *opt_string;
	unsigned int num;
	unsigned int num, opt_params;
	unsigned long long num_ll;
	unsigned long long num_ll;
	int r;
	int r;
	int i;
	int i;
	sector_t hash_position;
	sector_t hash_position;
	char dummy;
	char dummy;


	static struct dm_arg _args[] = {
		{0, 1, "Invalid number of feature args"},
	};

	v = kzalloc(sizeof(struct dm_verity), GFP_KERNEL);
	v = kzalloc(sizeof(struct dm_verity), GFP_KERNEL);
	if (!v) {
	if (!v) {
		ti->error = "Cannot allocate verity structure";
		ti->error = "Cannot allocate verity structure";
@@ -913,30 +948,10 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv)
		as.argc = argc;
		as.argc = argc;
		as.argv = argv;
		as.argv = argv;


		r = dm_read_arg_group(_args, &as, &opt_params, &ti->error);
		r = verity_parse_opt_args(&as, v);
		if (r)
		if (r < 0)
			goto bad;

		while (opt_params) {
			opt_params--;
			opt_string = dm_shift_arg(&as);
			if (!opt_string) {
				ti->error = "Not enough feature arguments";
				r = -EINVAL;
				goto bad;
			}

			if (!strcasecmp(opt_string, DM_VERITY_OPT_LOGGING))
				v->mode = DM_VERITY_MODE_LOGGING;
			else if (!strcasecmp(opt_string, DM_VERITY_OPT_RESTART))
				v->mode = DM_VERITY_MODE_RESTART;
			else {
				ti->error = "Invalid feature arguments";
				r = -EINVAL;
			goto bad;
			goto bad;
	}
	}
		}
	}


	v->hash_per_block_bits =
	v->hash_per_block_bits =
		__fls((1 << v->hash_dev_block_bits) / v->digest_size);
		__fls((1 << v->hash_dev_block_bits) / v->digest_size);