Fix userspace memory leaks found by Clang Static Analzyer

Recently, I have been making a push to fix things that coverity found.
However, I was curious what Clang's static analyzer reported, so I ran
it and found things that coverity had missed.

* contrib/pam_zfs_key/pam_zfs_key.c: If prop_mountpoint is passed more
  than once, we leak memory.
* module/zfs/zcp_get.c: We leak memory on temporary properties in
  userspace.
* tests/zfs-tests/cmd/draid.c: On error from vdev_draid_rand(), we leak
  memory if best_map had been allocated by a prior iteration.
* tests/zfs-tests/cmd/mkfile.c: Memory used by the loop is not freed
  before program termination.

Arguably, these are all minor issues, but if we ignore them, then they
could obscure serious bugs, so we fix them.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu>
Closes #13955
This commit is contained in:
Richard Yao 2022-09-26 20:18:05 -04:00 committed by GitHub
parent 5e7a2f4665
commit f7bda2de97
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 11 additions and 2 deletions

View File

@ -480,7 +480,8 @@ zfs_key_config_load(pam_handle_t *pamh, zfs_key_config_t *config,
} else if (strcmp(argv[c], "nounmount") == 0) {
config->unmount_and_unload = 0;
} else if (strcmp(argv[c], "prop_mountpoint") == 0) {
config->homedir = strdup(entry->pw_dir);
if (config->homedir == NULL)
config->homedir = strdup(entry->pw_dir);
}
}
return (0);

View File

@ -472,6 +472,7 @@ get_zap_prop(lua_State *state, dsl_dataset_t *ds, zfs_prop_t zfs_prop)
/* Fill in temporary value for prop, if applicable */
(void) zfs_get_temporary_prop(ds, zfs_prop, &numval, setpoint);
#else
kmem_free(strval, ZAP_MAXVALUELEN);
return (luaL_error(state,
"temporary properties only supported in kernel mode",
prop_name));

View File

@ -720,8 +720,11 @@ eval_maps(uint64_t children, int passes, uint64_t *map_seed,
*/
error = alloc_new_map(children, MAP_ROWS_DEFAULT,
vdev_draid_rand(map_seed), &map);
if (error)
if (error) {
if (best_map != NULL)
free_map(best_map);
return (error);
}
/*
* Consider maps with a lower worst_ratio to be of higher

View File

@ -276,5 +276,9 @@ main(int argc, char **argv)
argv++;
argc--;
}
if (buf)
free(buf);
return (errors);
}