mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-11-17 01:51:00 +03:00
nvlist leaked in zpool_find_config()
In `zpool_find_config()`, the `pools` nvlist is leaked. Part of it (a sub-nvlist) is returned in `*configp`, but the callers also leak that. Additionally, in `zdb.c:main()`, the `searchdirs` is leaked. The leaks were detected by ASAN (`configure --enable-asan`). This commit resolves the leaks. Reviewed-by: Igor Kozhukhov <igor@dilos.org> Reviewed-by: Ryan Moeller <ryan@iXsystems.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Matthew Ahrens <mahrens@delphix.com> Closes #11396
This commit is contained in:
parent
40ab927ae8
commit
b6722b871b
@ -8435,6 +8435,11 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (searchdirs != NULL) {
|
||||||
|
umem_free(searchdirs, nsearch * sizeof (char *));
|
||||||
|
searchdirs = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* import_checkpointed_state makes the assumption that the
|
* import_checkpointed_state makes the assumption that the
|
||||||
* target pool that we pass it is already part of the spa
|
* target pool that we pass it is already part of the spa
|
||||||
@ -8453,6 +8458,11 @@ main(int argc, char **argv)
|
|||||||
target = checkpoint_target;
|
target = checkpoint_target;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cfg != NULL) {
|
||||||
|
nvlist_free(cfg);
|
||||||
|
cfg = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (target_pool != target)
|
if (target_pool != target)
|
||||||
free(target_pool);
|
free(target_pool);
|
||||||
|
|
||||||
|
@ -150,6 +150,7 @@ zhack_import(char *target, boolean_t readonly)
|
|||||||
zfeature_checks_disable = B_TRUE;
|
zfeature_checks_disable = B_TRUE;
|
||||||
error = spa_import(target, config, props,
|
error = spa_import(target, config, props,
|
||||||
(readonly ? ZFS_IMPORT_SKIP_MMP : ZFS_IMPORT_NORMAL));
|
(readonly ? ZFS_IMPORT_SKIP_MMP : ZFS_IMPORT_NORMAL));
|
||||||
|
fnvlist_free(config);
|
||||||
zfeature_checks_disable = B_FALSE;
|
zfeature_checks_disable = B_FALSE;
|
||||||
if (error == EEXIST)
|
if (error == EEXIST)
|
||||||
error = 0;
|
error = 0;
|
||||||
|
@ -7153,6 +7153,7 @@ ztest_import_impl(ztest_shared_t *zs)
|
|||||||
VERIFY0(zpool_find_config(NULL, ztest_opts.zo_pool, &cfg, &args,
|
VERIFY0(zpool_find_config(NULL, ztest_opts.zo_pool, &cfg, &args,
|
||||||
&libzpool_config_ops));
|
&libzpool_config_ops));
|
||||||
VERIFY0(spa_import(ztest_opts.zo_pool, cfg, NULL, flags));
|
VERIFY0(spa_import(ztest_opts.zo_pool, cfg, NULL, flags));
|
||||||
|
fnvlist_free(cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1539,7 +1539,7 @@ zpool_find_config(void *hdl, const char *target, nvlist_t **configp,
|
|||||||
nvlist_t *pools;
|
nvlist_t *pools;
|
||||||
nvlist_t *match = NULL;
|
nvlist_t *match = NULL;
|
||||||
nvlist_t *config = NULL;
|
nvlist_t *config = NULL;
|
||||||
char *name = NULL, *sepp = NULL;
|
char *sepp = NULL;
|
||||||
char sep = '\0';
|
char sep = '\0';
|
||||||
int count = 0;
|
int count = 0;
|
||||||
char *targetdup = strdup(target);
|
char *targetdup = strdup(target);
|
||||||
@ -1563,11 +1563,11 @@ zpool_find_config(void *hdl, const char *target, nvlist_t **configp,
|
|||||||
/* multiple matches found */
|
/* multiple matches found */
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
match = config;
|
match = fnvlist_dup(config);
|
||||||
name = nvpair_name(elem);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fnvlist_free(pools);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count == 0) {
|
if (count == 0) {
|
||||||
@ -1577,6 +1577,7 @@ zpool_find_config(void *hdl, const char *target, nvlist_t **configp,
|
|||||||
|
|
||||||
if (count > 1) {
|
if (count > 1) {
|
||||||
free(targetdup);
|
free(targetdup);
|
||||||
|
fnvlist_free(match);
|
||||||
return (EINVAL);
|
return (EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user