Fix allocation errors, detected using ASAN

The test for VDEV_TYPE_INDIRECT is done after a memory allocation, and
could return from function without freeing it.  Since we don't need that
allocation yet, just postpone it.

Add a missing free() when buffer is no longer needed.

Reviewed-by: Matthew Ahrens <mahrens@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: João Carlos Mendes Luís <jonny@jonny.eng.br>
Closes #10193
This commit is contained in:
Joao Carlos Mendes Luis 2020-04-13 14:54:41 -03:00 committed by GitHub
parent 791e480c6a
commit 75c62019f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -4395,11 +4395,11 @@ print_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
uint64_t tdelta; uint64_t tdelta;
double scale; double scale;
calcvs = safe_malloc(sizeof (*calcvs));
if (strcmp(name, VDEV_TYPE_INDIRECT) == 0) if (strcmp(name, VDEV_TYPE_INDIRECT) == 0)
return (ret); return (ret);
calcvs = safe_malloc(sizeof (*calcvs));
if (oldnv != NULL) { if (oldnv != NULL) {
verify(nvlist_lookup_uint64_array(oldnv, verify(nvlist_lookup_uint64_array(oldnv,
ZPOOL_CONFIG_VDEV_STATS, (uint64_t **)&oldvs, &c) == 0); ZPOOL_CONFIG_VDEV_STATS, (uint64_t **)&oldvs, &c) == 0);
@ -7387,6 +7387,7 @@ print_removal_status(zpool_handle_t *zhp, pool_removal_stat_t *prs)
", (copy is slow, no estimated time)\n")); ", (copy is slow, no estimated time)\n"));
} }
} }
free(vdev_name);
if (prs->prs_mapping_memory > 0) { if (prs->prs_mapping_memory > 0) {
char mem_buf[7]; char mem_buf[7];