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

Commit 3050c208 authored by Jan Höppner's avatar Jan Höppner Committed by Martin Schwidefsky
Browse files

s390/dasd: Remove variable sized array



Dynamic stack allocations are considered bad. Get rid of this one
occurrence and use kstrdup() instead.

Also, set the return codes so that we have only one exit where we can
call kfree().

Signed-off-by: default avatarJan Höppner <hoeppner@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 9861dbd5
Loading
Loading
Loading
Loading
+30 −17
Original line number Diff line number Diff line
@@ -315,45 +315,58 @@ static int __init dasd_parse_range(const char *range)
	char *features_str = NULL;
	char *from_str = NULL;
	char *to_str = NULL;
	size_t len = strlen(range) + 1;
	char tmp[len];
	int rc = 0;
	char *tmp;

	strlcpy(tmp, range, len);
	tmp = kstrdup(range, GFP_KERNEL);
	if (!tmp)
		return -ENOMEM;

	if (dasd_evaluate_range_param(tmp, &from_str, &to_str, &features_str))
		goto out_err;
	if (dasd_evaluate_range_param(tmp, &from_str, &to_str, &features_str)) {
		rc = -EINVAL;
		goto out;
	}

	if (dasd_busid(from_str, &from_id0, &from_id1, &from))
		goto out_err;
	if (dasd_busid(from_str, &from_id0, &from_id1, &from)) {
		rc = -EINVAL;
		goto out;
	}

	to = from;
	to_id0 = from_id0;
	to_id1 = from_id1;
	if (to_str) {
		if (dasd_busid(to_str, &to_id0, &to_id1, &to))
			goto out_err;
		if (dasd_busid(to_str, &to_id0, &to_id1, &to)) {
			rc = -EINVAL;
			goto out;
		}
		if (from_id0 != to_id0 || from_id1 != to_id1 || from > to) {
			pr_err("%s is not a valid device range\n", range);
			goto out_err;
			rc = -EINVAL;
			goto out;
		}
	}

	features = dasd_feature_list(features_str);
	if (features < 0)
		goto out_err;
	if (features < 0) {
		rc = -EINVAL;
		goto out;
	}
	/* each device in dasd= parameter should be set initially online */
	features |= DASD_FEATURE_INITIAL_ONLINE;
	while (from <= to) {
		sprintf(bus_id, "%01x.%01x.%04x", from_id0, from_id1, from++);
		devmap = dasd_add_busid(bus_id, features);
		if (IS_ERR(devmap))
			return PTR_ERR(devmap);
		if (IS_ERR(devmap)) {
			rc = PTR_ERR(devmap);
			goto out;
		}
	}

	return 0;
out:
	kfree(tmp);

out_err:
	return -EINVAL;
	return rc;
}

/*