Message ID | 04b551a30763f776303c7ca8b0d0ffc0ed665e2a.1704168510.git.wqu@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | kstrtox: introduce memparse_safe() | expand |
On Tue, 2 Jan 2024 14:42:14 +1030, Qu Wenruo wrote: > The new helper has better error report and correct overflow detection, > furthermore the old @retptr behavior is also kept, thus there should be > no behavior change. > > Signed-off-by: Qu Wenruo <wqu@suse.com> > --- > fs/btrfs/ioctl.c | 6 +++++- > fs/btrfs/super.c | 9 ++++++++- > fs/btrfs/sysfs.c | 14 +++++++++++--- > 3 files changed, 24 insertions(+), 5 deletions(-) > > diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c > index 4e50b62db2a8..cb63f50a2078 100644 > --- a/fs/btrfs/ioctl.c > +++ b/fs/btrfs/ioctl.c > @@ -1175,7 +1175,11 @@ static noinline int btrfs_ioctl_resize(struct file *file, > mod = 1; > sizestr++; > } > - new_size = memparse(sizestr, &retptr); > + > + ret = memparse_safe(sizestr, MEMPARSE_SUFFIXES_DEFAULT, > + &new_size, &retptr); > + if (ret < 0) > + goto out_finish; > if (*retptr != '\0' || new_size == 0) { > ret = -EINVAL; > goto out_finish; > diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c > index 3a677b808f0f..0f29fd692e0f 100644 > --- a/fs/btrfs/super.c > +++ b/fs/btrfs/super.c > @@ -263,6 +263,8 @@ static int btrfs_parse_param(struct fs_context *fc, struct fs_parameter *param) > { > struct btrfs_fs_context *ctx = fc->fs_private; > struct fs_parse_result result; > + /* Only for memparse_safe() caller. */ > + int ret; > int opt; > > opt = fs_parse(fc, btrfs_fs_parameters, param, &result); > @@ -400,7 +402,12 @@ static int btrfs_parse_param(struct fs_context *fc, struct fs_parameter *param) > ctx->thread_pool_size = result.uint_32; > break; > case Opt_max_inline: > - ctx->max_inline = memparse(param->string, NULL); > + ret = memparse_safe(param->string, MEMPARSE_SUFFIXES_DEFAULT, > + &ctx->max_inline, NULL); > + if (ret < 0) { > + btrfs_err(NULL, "invalid string \"%s\"", param->string); > + return ret; > + } > break; > case Opt_acl: > if (result.negated) { > diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c > index 84c05246ffd8..6846572496a6 100644 > --- a/fs/btrfs/sysfs.c > +++ b/fs/btrfs/sysfs.c > @@ -762,6 +762,7 @@ static ssize_t btrfs_chunk_size_store(struct kobject *kobj, > struct btrfs_fs_info *fs_info = to_fs_info(get_btrfs_kobj(kobj)); > char *retptr; > u64 val; > + int ret; > > if (!capable(CAP_SYS_ADMIN)) > return -EPERM; > @@ -776,7 +777,10 @@ static ssize_t btrfs_chunk_size_store(struct kobject *kobj, > if (space_info->flags & BTRFS_BLOCK_GROUP_SYSTEM) > return -EPERM; > > - val = memparse(buf, &retptr); > + ret = memparse_safe(buf, MEMPARSE_SUFFIXES_DEFAULT, &val, &retptr); > + if (ret < 0) > + return ret; > + > /* There could be trailing '\n', also catch any typos after the value */ > retptr = skip_spaces(retptr); > if (*retptr != 0 || val == 0) > @@ -1779,10 +1783,14 @@ static ssize_t btrfs_devinfo_scrub_speed_max_store(struct kobject *kobj, > { > struct btrfs_device *device = container_of(kobj, struct btrfs_device, > devid_kobj); > - char *endptr; > unsigned long long limit; > + char *endptr; > + int ret; > + > + ret = memparse_safe(buf, MEMPARSE_SUFFIXES_DEFAULT, &limit, &endptr); > + if (ret < 0) > + return ret; > > - limit = memparse(buf, &endptr); > /* There could be trailing '\n', also catch any typos after the value. */ > endptr = skip_spaces(endptr); > if (*endptr != 0) Looks fine. Reviewed-by: David Disseldorp <ddiss@suse.de>
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 4e50b62db2a8..cb63f50a2078 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -1175,7 +1175,11 @@ static noinline int btrfs_ioctl_resize(struct file *file, mod = 1; sizestr++; } - new_size = memparse(sizestr, &retptr); + + ret = memparse_safe(sizestr, MEMPARSE_SUFFIXES_DEFAULT, + &new_size, &retptr); + if (ret < 0) + goto out_finish; if (*retptr != '\0' || new_size == 0) { ret = -EINVAL; goto out_finish; diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 3a677b808f0f..0f29fd692e0f 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -263,6 +263,8 @@ static int btrfs_parse_param(struct fs_context *fc, struct fs_parameter *param) { struct btrfs_fs_context *ctx = fc->fs_private; struct fs_parse_result result; + /* Only for memparse_safe() caller. */ + int ret; int opt; opt = fs_parse(fc, btrfs_fs_parameters, param, &result); @@ -400,7 +402,12 @@ static int btrfs_parse_param(struct fs_context *fc, struct fs_parameter *param) ctx->thread_pool_size = result.uint_32; break; case Opt_max_inline: - ctx->max_inline = memparse(param->string, NULL); + ret = memparse_safe(param->string, MEMPARSE_SUFFIXES_DEFAULT, + &ctx->max_inline, NULL); + if (ret < 0) { + btrfs_err(NULL, "invalid string \"%s\"", param->string); + return ret; + } break; case Opt_acl: if (result.negated) { diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index 84c05246ffd8..6846572496a6 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c @@ -762,6 +762,7 @@ static ssize_t btrfs_chunk_size_store(struct kobject *kobj, struct btrfs_fs_info *fs_info = to_fs_info(get_btrfs_kobj(kobj)); char *retptr; u64 val; + int ret; if (!capable(CAP_SYS_ADMIN)) return -EPERM; @@ -776,7 +777,10 @@ static ssize_t btrfs_chunk_size_store(struct kobject *kobj, if (space_info->flags & BTRFS_BLOCK_GROUP_SYSTEM) return -EPERM; - val = memparse(buf, &retptr); + ret = memparse_safe(buf, MEMPARSE_SUFFIXES_DEFAULT, &val, &retptr); + if (ret < 0) + return ret; + /* There could be trailing '\n', also catch any typos after the value */ retptr = skip_spaces(retptr); if (*retptr != 0 || val == 0) @@ -1779,10 +1783,14 @@ static ssize_t btrfs_devinfo_scrub_speed_max_store(struct kobject *kobj, { struct btrfs_device *device = container_of(kobj, struct btrfs_device, devid_kobj); - char *endptr; unsigned long long limit; + char *endptr; + int ret; + + ret = memparse_safe(buf, MEMPARSE_SUFFIXES_DEFAULT, &limit, &endptr); + if (ret < 0) + return ret; - limit = memparse(buf, &endptr); /* There could be trailing '\n', also catch any typos after the value. */ endptr = skip_spaces(endptr); if (*endptr != 0)
The new helper has better error report and correct overflow detection, furthermore the old @retptr behavior is also kept, thus there should be no behavior change. Signed-off-by: Qu Wenruo <wqu@suse.com> --- fs/btrfs/ioctl.c | 6 +++++- fs/btrfs/super.c | 9 ++++++++- fs/btrfs/sysfs.c | 14 +++++++++++--- 3 files changed, 24 insertions(+), 5 deletions(-)