Memory leak in zdb:import_checkpointed_state()

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:
Matthew Ahrens 2020-12-24 21:07:24 -08:00 committed by Brian Behlendorf
parent f014700a37
commit 808e681238
1 changed files with 5 additions and 2 deletions

View File

@ -6762,6 +6762,7 @@ import_checkpointed_state(char *target, nvlist_t *cfg, char **new_path)
{ {
int error = 0; int error = 0;
char *poolname, *bogus_name = NULL; char *poolname, *bogus_name = NULL;
boolean_t freecfg = B_FALSE;
/* If the target is not a pool, the extract the pool name */ /* If the target is not a pool, the extract the pool name */
char *path_start = strchr(target, '/'); char *path_start = strchr(target, '/');
@ -6780,6 +6781,7 @@ import_checkpointed_state(char *target, nvlist_t *cfg, char **new_path)
"spa_get_stats() failed with error %d\n", "spa_get_stats() failed with error %d\n",
poolname, error); poolname, error);
} }
freecfg = B_TRUE;
} }
if (asprintf(&bogus_name, "%s%s", poolname, BOGUS_SUFFIX) == -1) if (asprintf(&bogus_name, "%s%s", poolname, BOGUS_SUFFIX) == -1)
@ -6789,6 +6791,8 @@ import_checkpointed_state(char *target, nvlist_t *cfg, char **new_path)
error = spa_import(bogus_name, cfg, NULL, error = spa_import(bogus_name, cfg, NULL,
ZFS_IMPORT_MISSING_LOG | ZFS_IMPORT_CHECKPOINT | ZFS_IMPORT_MISSING_LOG | ZFS_IMPORT_CHECKPOINT |
ZFS_IMPORT_SKIP_MMP); ZFS_IMPORT_SKIP_MMP);
if (freecfg)
nvlist_free(cfg);
if (error != 0) { if (error != 0) {
fatal("Tried to import pool \"%s\" but spa_import() failed " fatal("Tried to import pool \"%s\" but spa_import() failed "
"with error %d\n", bogus_name, error); "with error %d\n", bogus_name, error);
@ -7017,7 +7021,6 @@ verify_checkpoint_blocks(spa_t *spa)
spa_t *checkpoint_spa; spa_t *checkpoint_spa;
char *checkpoint_pool; char *checkpoint_pool;
nvlist_t *config = NULL;
int error = 0; int error = 0;
/* /*
@ -7025,7 +7028,7 @@ verify_checkpoint_blocks(spa_t *spa)
* name) so we can do verification on it against the current state * name) so we can do verification on it against the current state
* of the pool. * of the pool.
*/ */
checkpoint_pool = import_checkpointed_state(spa->spa_name, config, checkpoint_pool = import_checkpointed_state(spa->spa_name, NULL,
NULL); NULL);
ASSERT(strcmp(spa->spa_name, checkpoint_pool) != 0); ASSERT(strcmp(spa->spa_name, checkpoint_pool) != 0);