btrfs-progs: don't write to optarg in btrfs_qgroup_parse_sort_string
authorDavid Sterba <dsterba@suse.com>
Thu, 29 Sep 2016 15:25:46 +0000 (17:25 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 3 Oct 2016 13:07:23 +0000 (15:07 +0200)
Dup the string that gets passed to strtok so we don't destroy callers
buffer.

Signed-off-by: David Sterba <dsterba@suse.com>
qgroup.c

index cd9f5a7..2d5d555 100644 (file)
--- 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)