diff options
| author | saturneric <[email protected]> | 2025-06-11 23:38:21 +0000 |
|---|---|---|
| committer | saturneric <[email protected]> | 2025-06-11 23:38:21 +0000 |
| commit | 0e99f621a88db810f7f95ccb917cf00924cb6e39 (patch) | |
| tree | 21f3653194dcc5e81bfb0205155a152f727f4cf3 /lib/string_helpers.c | |
| parent | Merge tag 'v6.15' (diff) | |
| parent | Linux 6.16-rc1 (diff) | |
| download | kernel-0e99f621a88db810f7f95ccb917cf00924cb6e39.tar.gz kernel-0e99f621a88db810f7f95ccb917cf00924cb6e39.zip | |
Merge tag 'v6.16-rc1'
Linux 6.16-rc1
Diffstat (limited to 'lib/string_helpers.c')
| -rw-r--r-- | lib/string_helpers.c | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/lib/string_helpers.c b/lib/string_helpers.c index 91fa37b5c510..ffb8ead6d4cd 100644 --- a/lib/string_helpers.c +++ b/lib/string_helpers.c @@ -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; } |
