forked from Minki/linux
lib/string_helpers: Introduce parse_int_array_user()
Add new helper function to allow for splitting specified user string into a sequence of integers. Internally it makes use of get_options() so the returned sequence contains the integers extracted plus an additional element that begins the sequence and specifies the integers count. Suggested-by: Andy Shevchenko <andy.shevchenko@gmail.com> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com> Link: https://lore.kernel.org/r/20220904102840.862395-2-cezary.rojewski@intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
376be51caf
commit
f0b933236e
@ -21,6 +21,8 @@ enum string_size_units {
|
||||
void string_get_size(u64 size, u64 blk_size, enum string_size_units units,
|
||||
char *buf, int len);
|
||||
|
||||
int parse_int_array_user(const char __user *from, size_t count, int **array);
|
||||
|
||||
#define UNESCAPE_SPACE BIT(0)
|
||||
#define UNESCAPE_OCTAL BIT(1)
|
||||
#define UNESCAPE_HEX BIT(2)
|
||||
|
@ -131,6 +131,50 @@ void string_get_size(u64 size, u64 blk_size, const enum string_size_units units,
|
||||
}
|
||||
EXPORT_SYMBOL(string_get_size);
|
||||
|
||||
/**
|
||||
* parse_int_array_user - Split string into a sequence of integers
|
||||
* @from: The user space buffer to read from
|
||||
* @count: The maximum number of bytes to read
|
||||
* @array: Returned pointer to sequence of integers
|
||||
*
|
||||
* On success @array is allocated and initialized with a sequence of
|
||||
* integers extracted from the @from plus an additional element that
|
||||
* begins the sequence and specifies the integers count.
|
||||
*
|
||||
* Caller takes responsibility for freeing @array when it is no longer
|
||||
* needed.
|
||||
*/
|
||||
int parse_int_array_user(const char __user *from, size_t count, int **array)
|
||||
{
|
||||
int *ints, nints;
|
||||
char *buf;
|
||||
int ret = 0;
|
||||
|
||||
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:
|
||||
kfree(buf);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(parse_int_array_user);
|
||||
|
||||
static bool unescape_space(char **src, char **dst)
|
||||
{
|
||||
char *p = *dst, *q = *src;
|
||||
|
Loading…
Reference in New Issue
Block a user