diff options
author | luozhengzheng <[email protected]> | 2016-09-01 10:23:10 +0800 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2016-09-12 13:02:47 -0700 |
commit | a425f5bff92f2db78f588543f49ce3abbd98a7f9 (patch) | |
tree | acc7725382bcb0267482faaea0d7f6faa47624a9 /cmd/zpool/zpool_main.c | |
parent | e33da554c5daf0103b093f44ab5b90ad6c064c3f (diff) |
Fix memleak in zfs_do_* and zpool_do_*
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: luozhengzheng <[email protected]>
Closes #5056
Diffstat (limited to 'cmd/zpool/zpool_main.c')
-rw-r--r-- | cmd/zpool/zpool_main.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c index 09531b21d..e512688b7 100644 --- a/cmd/zpool/zpool_main.c +++ b/cmd/zpool/zpool_main.c @@ -1296,6 +1296,7 @@ zpool_do_destroy(int argc, char **argv) if (zpool_disable_datasets(zhp, force) != 0) { (void) fprintf(stderr, gettext("could not destroy '%s': " "could not unmount datasets\n"), zpool_get_name(zhp)); + zpool_close(zhp); return (1); } @@ -2343,6 +2344,7 @@ zpool_do_import(int argc, char **argv) if (searchdirs != NULL) free(searchdirs); + nvlist_free(props); nvlist_free(policy); return (1); } @@ -2449,6 +2451,8 @@ zpool_do_import(int argc, char **argv) if (envdup != NULL) free(envdup); nvlist_free(policy); + nvlist_free(pools); + nvlist_free(props); return (1); } @@ -4749,13 +4753,16 @@ zpool_do_attach_or_replace(int argc, char **argv, int replacing) usage(B_FALSE); } - if ((zhp = zpool_open(g_zfs, poolname)) == NULL) + if ((zhp = zpool_open(g_zfs, poolname)) == NULL) { + nvlist_free(props); return (1); + } if (zpool_get_config(zhp, NULL) == NULL) { (void) fprintf(stderr, gettext("pool '%s' is unavailable\n"), poolname); zpool_close(zhp); + nvlist_free(props); return (1); } @@ -4763,11 +4770,13 @@ zpool_do_attach_or_replace(int argc, char **argv, int replacing) argc, argv); if (nvroot == NULL) { zpool_close(zhp); + nvlist_free(props); return (1); } ret = zpool_vdev_attach(zhp, old_disk, new_disk, nvroot, replacing); + nvlist_free(props); nvlist_free(nvroot); zpool_close(zhp); @@ -4973,8 +4982,10 @@ zpool_do_split(int argc, char **argv) argc -= 2; argv += 2; - if ((zhp = zpool_open(g_zfs, srcpool)) == NULL) + if ((zhp = zpool_open(g_zfs, srcpool)) == NULL) { + nvlist_free(props); return (1); + } config = split_mirror_vdev(zhp, newpool, props, flags, argc, argv); if (config == NULL) { @@ -4986,20 +4997,25 @@ zpool_do_split(int argc, char **argv) print_vdev_tree(NULL, newpool, config, 0, B_FALSE, flags.name_flags); } - nvlist_free(config); } zpool_close(zhp); - if (ret != 0 || flags.dryrun || !flags.import) + if (ret != 0 || flags.dryrun || !flags.import) { + nvlist_free(config); + nvlist_free(props); return (ret); + } /* * The split was successful. Now we need to open the new * pool and import it. */ - if ((zhp = zpool_open_canfail(g_zfs, newpool)) == NULL) + if ((zhp = zpool_open_canfail(g_zfs, newpool)) == NULL) { + nvlist_free(config); + nvlist_free(props); return (1); + } if (zpool_get_state(zhp) != POOL_STATE_UNAVAIL && zpool_enable_datasets(zhp, mntopts, 0) != 0) { ret = 1; @@ -5009,6 +5025,8 @@ zpool_do_split(int argc, char **argv) "different altroot\n"), "zpool import"); } zpool_close(zhp); + nvlist_free(config); + nvlist_free(props); return (ret); } |