From 9fcdf8f8945bfddb7e1155bc9da68aed33e4737c Mon Sep 17 00:00:00 2001 From: David Sterba Date: Thu, 29 Sep 2016 17:25:46 +0200 Subject: btrfs-progs: don't write to optarg in btrfs_qgroup_parse_sort_string Dup the string that gets passed to strtok so we don't destroy callers buffer. Signed-off-by: David Sterba --- qgroup.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) (limited to 'qgroup.c') diff --git a/qgroup.c b/qgroup.c index cd9f5a7d..2d5d5559 100644 --- a/qgroup.c +++ b/qgroup.c @@ -1233,8 +1233,14 @@ int btrfs_qgroup_parse_sort_string(char *opt_arg, char *p; char **ptr_argv; int what_to_sort; + char *opt_tmp; + int ret = 0; - while ((p = strtok(opt_arg, ",")) != NULL) { + opt_tmp = strdup(opt_arg); + if (!opt_tmp) + return -ENOMEM; + + while ((p = strtok(opt_tmp, ",")) != NULL) { flag = 0; ptr_argv = all_sort_items; @@ -1254,10 +1260,10 @@ int btrfs_qgroup_parse_sort_string(char *opt_arg, ptr_argv++; } - if (flag == 0) - return -1; - - else { + if (flag == 0) { + ret = -1; + goto out; + } else { if (*p == '+') { order = 0; p++; @@ -1268,14 +1274,19 @@ int btrfs_qgroup_parse_sort_string(char *opt_arg, order = 0; what_to_sort = btrfs_qgroup_get_sort_item(p); - if (what_to_sort < 0) - return -1; + if (what_to_sort < 0) { + ret = -1; + goto out; + } btrfs_qgroup_setup_comparer(comps, what_to_sort, order); } - opt_arg = NULL; + free(opt_tmp); + opt_tmp = NULL; } - return 0; +out: + free(opt_tmp); + return ret; } int qgroup_inherit_size(struct btrfs_qgroup_inherit *p) -- cgit v1.2.3