]> git.sesse.net Git - bcachefs-tools-debian/commitdiff
Fix some small memory leaks
authorKent Overstreet <kent.overstreet@gmail.com>
Fri, 16 Apr 2021 21:28:14 +0000 (17:28 -0400)
committerKent Overstreet <kent.overstreet@gmail.com>
Fri, 16 Apr 2021 21:28:40 +0000 (17:28 -0400)
Found with -fsanitize=leak

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
cmd_attr.c
cmd_format.c
cmd_migrate.c
libbcachefs.c
libbcachefs.h
libbcachefs/fsck.c

index aef42f4eebfbaae8f37588bb4c7baffd93ce9db2..736554c76383f646c6194a85f301f0c70fe8e25f 100644 (file)
@@ -108,6 +108,7 @@ int cmd_setattr(int argc, char *argv[])
 
        for (i = 1; i < argc; i++)
                do_setattr(argv[i], opts);
+       bch2_opt_strs_free(&opts);
 
        return 0;
 }
index b88ffe91f6c05c8751d285a2293725dfb5d93234..3f96f5de3c221acb8cfafca33bd12acb0003aef8 100644 (file)
@@ -236,6 +236,7 @@ int cmd_format(int argc, char *argv[])
                            fs_opts,
                            opts,
                            devices.item, darray_size(devices));
+       bch2_opt_strs_free(&fs_opt_strs);
 
        if (!quiet)
                bch2_sb_print(sb, false, 1 << BCH_SB_FIELD_members, HUMAN_READABLE);
index a0d27427a13487adb0c3169472ade84f48aa4f47..51260906dccd95f71ed71627095dbe187777ba47 100644 (file)
@@ -773,10 +773,12 @@ int cmd_migrate(int argc, char *argv[])
        if (format_opts.encrypted && !no_passphrase)
                format_opts.passphrase = read_passphrase_twice("Enter passphrase: ");
 
-       return migrate_fs(fs_path,
-                         fs_opt_strs,
-                         fs_opts,
-                         format_opts, force);
+       int ret = migrate_fs(fs_path,
+                            fs_opt_strs,
+                            fs_opts,
+                            format_opts, force);
+       bch2_opt_strs_free(&fs_opt_strs);
+       return ret;
 }
 
 static void migrate_superblock_usage(void)
index e5dcfd8f7bf9a07bd3cb9f4ed0965422262a5cf8..fbcb237f50f620c44335adaa6a2f594227400272 100644 (file)
@@ -1006,6 +1006,16 @@ int bchu_data(struct bchfs_handle fs, struct bch_ioctl_data cmd)
 
 /* option parsing */
 
+void bch2_opt_strs_free(struct bch_opt_strs *opts)
+{
+       unsigned i;
+
+       for (i = 0; i < bch2_opts_nr; i++) {
+               free(opts->by_id[i]);
+               opts->by_id[i] = NULL;
+       }
+}
+
 struct bch_opt_strs bch2_cmdline_opts_get(int *argc, char *argv[],
                                          unsigned opt_types)
 {
@@ -1038,9 +1048,8 @@ struct bch_opt_strs bch2_cmdline_opts_get(int *argc, char *argv[],
                optid = bch2_opt_lookup(optstr);
                if (optid < 0 ||
                    !(bch2_opt_table[optid].mode & opt_types)) {
-                       free(optstr);
                        i++;
-                       continue;
+                       goto next;
                }
 
                if (!valstr &&
@@ -1052,13 +1061,15 @@ struct bch_opt_strs bch2_cmdline_opts_get(int *argc, char *argv[],
                if (!valstr)
                        valstr = "1";
 
-               opts.by_id[optid] = valstr;
+               opts.by_id[optid] = strdup(valstr);
 
                *argc -= nr_args;
                memmove(&argv[i],
                        &argv[i + nr_args],
                        sizeof(char *) * (*argc - i));
                argv[*argc] = NULL;
+next:
+               free(optstr);
        }
 
        return opts;
index 45d2f8740a41479e852411103e38e24a20394b9f..7cdbf69622548aa9f88bf982a65756a6673c8ef0 100644 (file)
@@ -25,6 +25,7 @@ struct {
 };
 };
 
+void bch2_opt_strs_free(struct bch_opt_strs *);
 struct bch_opt_strs bch2_cmdline_opts_get(int *, char *[], unsigned);
 struct bch_opts bch2_parse_opts(struct bch_opt_strs);
 void bch2_opts_usage(unsigned);
index bcd95df072a32742883b8052500f159d50d3becc..6280b357095c034a70ea9b2c8943901c203dccd2 100644 (file)
@@ -1138,6 +1138,8 @@ static int check_directory_structure(struct bch_fs *c,
 
        BUG_ON(ret == -EINTR);
 
+       kfree(path.entries);
+
        return bch2_trans_exit(&trans) ?: ret;
 }