Unverified Commit 83b9ae77 authored by Cezary Rojewski's avatar Cezary Rojewski Committed by Mark Brown
Browse files

lib/string_helpers: Introduce parse_int_array()



Existing parse_inte_array_user() works with __user buffers only.
Separate array parsing from __user bits so the functionality can be
utilized with kernel buffers too.

Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: default avatarAmadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Signed-off-by: default avatarCezary Rojewski <cezary.rojewski@intel.com>
Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://patch.msgid.link/20250404090337.3564117-2-cezary.rojewski@intel.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 0af2f6be
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ enum string_size_units {
int string_get_size(u64 size, u64 blk_size, const enum string_size_units units,
		    char *buf, int len);

int parse_int_array(const char *buf, size_t count, int **array);
int parse_int_array_user(const char __user *from, size_t count, int **array);

#define UNESCAPE_SPACE		BIT(0)
+21 −18
Original line number Diff line number Diff line
@@ -138,6 +138,25 @@ int string_get_size(u64 size, u64 blk_size, const enum string_size_units units,
}
EXPORT_SYMBOL(string_get_size);

int parse_int_array(const char *buf, size_t count, int **array)
{
	int *ints, nints;

	get_options(buf, 0, &nints);
	if (!nints)
		return -ENOENT;

	ints = kcalloc(nints + 1, sizeof(*ints), GFP_KERNEL);
	if (!ints)
		return -ENOMEM;

	get_options(buf, nints + 1, ints);
	*array = ints;

	return 0;
}
EXPORT_SYMBOL(parse_int_array);

/**
 * parse_int_array_user - Split string into a sequence of integers
 * @from:	The user space buffer to read from
@@ -153,30 +172,14 @@ EXPORT_SYMBOL(string_get_size);
 */
int parse_int_array_user(const char __user *from, size_t count, int **array)
{
	int *ints, nints;
	char *buf;
	int ret = 0;
	int ret;

	buf = memdup_user_nul(from, count);
	if (IS_ERR(buf))
		return PTR_ERR(buf);

	get_options(buf, 0, &nints);
	if (!nints) {
		ret = -ENOENT;
		goto free_buf;
	}

	ints = kcalloc(nints + 1, sizeof(*ints), GFP_KERNEL);
	if (!ints) {
		ret = -ENOMEM;
		goto free_buf;
	}

	get_options(buf, nints + 1, ints);
	*array = ints;

free_buf:
	ret = parse_int_array(buf, count, array);
	kfree(buf);
	return ret;
}