diff mbox

[1/3] Btrfs: add sanity checks regarding to parsing mount options

Message ID 51EE13DB.5060205@cn.fujitsu.com (mailing list archive)
State Superseded, archived
Headers show

Commit Message

Wang Shilong July 23, 2013, 5:25 a.m. UTC
I just notice the following commands succeed:
	mount <dev> <mnt> -o thread_pool=-1

This is ridiculous, only positive thread_pool makes sense,this
patch adds sanity checks for them, and also catches the error of
ENOMEM if allocating memory fails.

Signed-off-by: Wang Shilong<wangsl.fnst@cn.fujitsu.com>
Reviewed-by: Miao Xie<miaox@cn.fujitsu.com>
---
  fs/btrfs/super.c | 47 +++++++++++++++++++++++++++++++++++++----------
  1 file changed, 37 insertions(+), 10 deletions(-)

-- 1.8.0.1

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Wang Shilong July 23, 2013, 1:04 p.m. UTC | #1
I am sorry for wrong format patch, please ignore this patchset, i will resend
them later.

Thank,
Wang
2013/7/23 Wang Shilong <wangsl.fnst@cn.fujitsu.com>:
> I just notice the following commands succeed:
>         mount <dev> <mnt> -o thread_pool=-1
>
> This is ridiculous, only positive thread_pool makes sense,this
> patch adds sanity checks for them, and also catches the error of
> ENOMEM if allocating memory fails.
>
> Signed-off-by: Wang Shilong<wangsl.fnst@cn.fujitsu.com>
> Reviewed-by: Miao Xie<miaox@cn.fujitsu.com>
> ---
>  fs/btrfs/super.c | 47 +++++++++++++++++++++++++++++++++++++----------
>  1 file changed, 37 insertions(+), 10 deletions(-)
>
> diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
> index 8eb6191..cc00295 100644
> --- a/fs/btrfs/super.c
> +++ b/fs/btrfs/super.c
> @@ -496,10 +496,15 @@ int btrfs_parse_options(struct btrfs_root *root, char
> *options)
>                         btrfs_set_opt(info->mount_opt, NOBARRIER);
>                         break;
>                 case Opt_thread_pool:
> -                       intarg = 0;
> -                       match_int(&args[0], &intarg);
> -                       if (intarg)
> +                       ret = match_int(&args[0], &intarg);
> +                       if (ret) {
> +                               goto out;
> +                       } else if (intarg > 0) {
>                                 info->thread_pool_size = intarg;
> +                       } else {
> +                               ret = -EINVAL;
> +                               goto out;
> +                       }
>                         break;
>                 case Opt_max_inline:
>                         num = match_strdup(&args[0]);
> @@ -514,6 +519,9 @@ int btrfs_parse_options(struct btrfs_root *root, char
> *options)
>                                 }
>                                 printk(KERN_INFO "btrfs: max_inline at
> %llu\n",
>                                         (unsigned long
> long)info->max_inline);
> +                       } else {
> +                               ret = -ENOMEM;
> +                               goto out;
>                         }
>                         break;
>                 case Opt_alloc_start:
> @@ -526,6 +534,9 @@ int btrfs_parse_options(struct btrfs_root *root, char
> *options)
>                                 printk(KERN_INFO
>                                         "btrfs: allocations start at
> %llu\n",
>                                         (unsigned long
> long)info->alloc_start);
> +                       } else {
> +                               ret = -ENOMEM;
> +                               goto out;
>                         }
>                         break;
>                 case Opt_noacl:
> @@ -540,12 +551,16 @@ int btrfs_parse_options(struct btrfs_root *root, char
> *options)
>                         btrfs_set_opt(info->mount_opt, FLUSHONCOMMIT);
>                         break;
>                 case Opt_ratio:
> -                       intarg = 0;
> -                       match_int(&args[0], &intarg);
> -                       if (intarg) {
> +                       ret = match_int(&args[0], &intarg);
> +                       if (ret) {
> +                               goto out;
> +                       } else if (intarg >= 0) {
>                                 info->metadata_ratio = intarg;
>                                 printk(KERN_INFO "btrfs: metadata ratio
> %d\n",
>                                        info->metadata_ratio);
> +                       } else {
> +                               ret = -EINVAL;
> +                               goto out;
>                         }
>                         break;
>                 case Opt_discard:
> @@ -596,13 +611,17 @@ int btrfs_parse_options(struct btrfs_root *root, char
> *options)
>                         btrfs_set_opt(info->mount_opt, CHECK_INTEGRITY);
>                         break;
>                 case Opt_check_integrity_print_mask:
> -                       intarg = 0;
> -                       match_int(&args[0], &intarg);
> -                       if (intarg) {
> +                       ret = match_int(&args[0], &intarg);
> +                       if (ret) {
> +                               goto out;
> +                       } else if (intarg >= 0) {
>                                 info->check_integrity_print_mask = intarg;
>                                 printk(KERN_INFO "btrfs:"
>                                        " check_integrity_print_mask 0x%x\n",
>                                        info->check_integrity_print_mask);
> +                       } else {
> +                               ret = -EINVAL;
> +                               goto out;
>                         }
>                         break;
>  #else
> @@ -679,17 +698,25 @@ static int btrfs_parse_early_options(const char
> *options, fmode_t flags,
>                 case Opt_subvol:
>                         kfree(*subvol_name);
>                         *subvol_name = match_strdup(&args[0]);
> +                       if (!*subvol_name) {
> +                               error = -ENOMEM;
> +                               goto out;
> +                       }
>                         break;
>                 case Opt_subvolid:
> -                       intarg = 0;
>                         error = match_int(&args[0], &intarg);
>                         if (!error) {
> +                               goto out;
> +                       } else if (intarg >= 0) {
>                                 /* we want the original fs_tree */
>                                 if (!intarg)
>                                         *subvol_objectid =
>                                                 BTRFS_FS_TREE_OBJECTID;
>                                 else
>                                         *subvol_objectid = intarg;
> +                       } else {
> +                               error = -EINVAL;
> +                               goto out;
>                         }
>                         break;
>                 case Opt_subvolrootid:
> -- 1.8.0.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index 8eb6191..cc00295 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -496,10 +496,15 @@  int btrfs_parse_options(struct btrfs_root *root, char *options)
  			btrfs_set_opt(info->mount_opt, NOBARRIER);
  			break;
  		case Opt_thread_pool:
-			intarg = 0;
-			match_int(&args[0], &intarg);
-			if (intarg)
+			ret = match_int(&args[0], &intarg);
+			if (ret) {
+				goto out;
+			} else if (intarg > 0) {
  				info->thread_pool_size = intarg;
+			} else {
+				ret = -EINVAL;
+				goto out;
+			}
  			break;
  		case Opt_max_inline:
  			num = match_strdup(&args[0]);
@@ -514,6 +519,9 @@  int btrfs_parse_options(struct btrfs_root *root, char *options)
  				}
  				printk(KERN_INFO "btrfs: max_inline at %llu\n",
  					(unsigned long long)info->max_inline);
+			} else {
+				ret = -ENOMEM;
+				goto out;
  			}
  			break;
  		case Opt_alloc_start:
@@ -526,6 +534,9 @@  int btrfs_parse_options(struct btrfs_root *root, char *options)
  				printk(KERN_INFO
  					"btrfs: allocations start at %llu\n",
  					(unsigned long long)info->alloc_start);
+			} else {
+				ret = -ENOMEM;
+				goto out;
  			}
  			break;
  		case Opt_noacl:
@@ -540,12 +551,16 @@  int btrfs_parse_options(struct btrfs_root *root, char *options)
  			btrfs_set_opt(info->mount_opt, FLUSHONCOMMIT);
  			break;
  		case Opt_ratio:
-			intarg = 0;
-			match_int(&args[0], &intarg);
-			if (intarg) {
+			ret = match_int(&args[0], &intarg);
+			if (ret) {
+				goto out;
+			} else if (intarg >= 0) {
  				info->metadata_ratio = intarg;
  				printk(KERN_INFO "btrfs: metadata ratio %d\n",
  				       info->metadata_ratio);
+			} else {
+				ret = -EINVAL;
+				goto out;
  			}
  			break;
  		case Opt_discard:
@@ -596,13 +611,17 @@  int btrfs_parse_options(struct btrfs_root *root, char *options)
  			btrfs_set_opt(info->mount_opt, CHECK_INTEGRITY);
  			break;
  		case Opt_check_integrity_print_mask:
-			intarg = 0;
-			match_int(&args[0], &intarg);
-			if (intarg) {
+			ret = match_int(&args[0], &intarg);
+			if (ret) {
+				goto out;
+			} else if (intarg >= 0) {
  				info->check_integrity_print_mask = intarg;
  				printk(KERN_INFO "btrfs:"
  				       " check_integrity_print_mask 0x%x\n",
  				       info->check_integrity_print_mask);
+			} else {
+				ret = -EINVAL;
+				goto out;
  			}
  			break;
  #else
@@ -679,17 +698,25 @@  static int btrfs_parse_early_options(const char *options, fmode_t flags,
  		case Opt_subvol:
  			kfree(*subvol_name);
  			*subvol_name = match_strdup(&args[0]);
+			if (!*subvol_name) {
+				error = -ENOMEM;
+				goto out;
+			}
  			break;
  		case Opt_subvolid:
-			intarg = 0;
  			error = match_int(&args[0], &intarg);
  			if (!error) {
+				goto out;
+			} else if (intarg >= 0) {
  				/* we want the original fs_tree */
  				if (!intarg)
  					*subvol_objectid =
  						BTRFS_FS_TREE_OBJECTID;
  				else
  					*subvol_objectid = intarg;
+			} else {
+				error = -EINVAL;
+				goto out;
  			}
  			break;
  		case Opt_subvolrootid: