Currently, when passing a negative integer as argument, the error
message is "too big" due to casting to an unsigned integer:

    > bcachefs format --block_size=-1 bcachefs.img
    invalid option: block_size: too big (max 65536)

When negative value in argument detected, return early before
calling bch2_opt_validate().

A new error code `BCH_ERR_option_negative` is added.

Signed-off-by: Integral <[email protected]>
---
 fs/bcachefs/errcode.h |  1 +
 fs/bcachefs/opts.c    | 12 +++++++++---
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/fs/bcachefs/errcode.h b/fs/bcachefs/errcode.h
index c4eb0ed9838d..e3c85288fd6d 100644
--- a/fs/bcachefs/errcode.h
+++ b/fs/bcachefs/errcode.h
@@ -213,6 +213,7 @@
        x(EINVAL,                       inode_unpack_error)                     
\
        x(EINVAL,                       varint_decode_error)                    
\
        x(EINVAL,                       erasure_coding_found_btree_node)        
\
+       x(EINVAL,                       option_negative)                        
\
        x(EOPNOTSUPP,                   may_not_use_incompat_feature)           
\
        x(EROFS,                        erofs_trans_commit)                     
\
        x(EROFS,                        erofs_no_writes)                        
\
diff --git a/fs/bcachefs/opts.c b/fs/bcachefs/opts.c
index e64777ecf44f..1bf2580ab735 100644
--- a/fs/bcachefs/opts.c
+++ b/fs/bcachefs/opts.c
@@ -360,9 +360,15 @@ int bch2_opt_parse(struct bch_fs *c,
                        return -EINVAL;
                }
 
-               ret = opt->flags & OPT_HUMAN_READABLE
-                       ? bch2_strtou64_h(val, res)
-                       : kstrtou64(val, 10, res);
+               if (*val != '-') {
+                       ret = opt->flags & OPT_HUMAN_READABLE
+                           ? bch2_strtou64_h(val, res)
+                           : kstrtou64(val, 10, res);
+               } else {
+                       prt_printf(err, "%s: must be a non-negative number", 
opt->attr.name);
+                       return -BCH_ERR_option_negative;
+               }
+
                if (ret < 0) {
                        if (err)
                                prt_printf(err, "%s: must be a number",
-- 
2.49.0


Reply via email to