diff options
author | Anand Jain <anand.jain@oracle.com> | 2018-02-15 01:11:37 +0800 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2018-03-26 15:09:39 +0200 |
commit | ccb0e7d1c1bc222966085550e27957c17138b629 (patch) | |
tree | 8640be8a98f735e9e0f22437ee99d1a1cd2055b3 | |
parent | 5811375325420052fcadd944792a416a43072b7f (diff) | |
download | linux-ccb0e7d1c1bc222966085550e27957c17138b629.tar.bz2 |
btrfs: verify subvolid mount parameter
We aren't verifying the parameter passed to the subvolid mount option,
so we won't report and fail the mount if a junk value is specified for
example, -o subvolid=abc.
This patch verifies the subvolid option with match_u64.
Up to now the memparse function accepts the K/M/G/ suffixes, that are
usually meant for size values and do not make sense for a subvolume it.
Signed-off-by: Anand Jain <anand.jain@oracle.com>
Reviewed-by: David Sterba <dsterba@suse.com>
[ update changelog ]
Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r-- | fs/btrfs/super.c | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 5d752f791950..07bc2bfbdb96 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -914,8 +914,8 @@ static int btrfs_parse_subvol_options(const char *options, fmode_t flags, { substring_t args[MAX_OPT_ARGS]; char *opts, *orig, *p; - char *num = NULL; int error = 0; + u64 subvolid; if (!options) return 0; @@ -945,18 +945,15 @@ static int btrfs_parse_subvol_options(const char *options, fmode_t flags, } break; case Opt_subvolid: - num = match_strdup(&args[0]); - if (num) { - *subvol_objectid = memparse(num, NULL); - kfree(num); - /* we want the original fs_tree */ - if (!*subvol_objectid) - *subvol_objectid = - BTRFS_FS_TREE_OBJECTID; - } else { - error = -EINVAL; + error = match_u64(&args[0], &subvolid); + if (error) goto out; - } + + /* we want the original fs_tree */ + if (subvolid == 0) + subvolid = BTRFS_FS_TREE_OBJECTID; + + *subvol_objectid = subvolid; break; case Opt_subvolrootid: pr_warn("BTRFS: 'subvolrootid' mount option is deprecated and has no effect\n"); |