summaryrefslogtreecommitdiff
path: root/qgroup.c
diff options
context:
space:
mode:
authorDavid Sterba <dsterba@suse.com>2016-09-29 17:25:46 +0200
committerDavid Sterba <dsterba@suse.com>2016-10-03 15:07:23 +0200
commit9fcdf8f8945bfddb7e1155bc9da68aed33e4737c (patch)
tree1ae964b32ddc3f770b5344878ecf9af9c608d814 /qgroup.c
parent2761c37d25e61e0bff04f0dac076ba9d1edb87be (diff)
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 <dsterba@suse.com>
Diffstat (limited to 'qgroup.c')
-rw-r--r--qgroup.c29
1 files changed, 20 insertions, 9 deletions
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)