Skip to content

Commit

Permalink
Fix userspace memory leaks found by Clang Static Analzyer
Browse files Browse the repository at this point in the history
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
  • Loading branch information
ryao authored Sep 27, 2022
1 parent 5e7a2f4 commit f7bda2d
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 2 deletions.
3 changes: 2 additions & 1 deletion contrib/pam_zfs_key/pam_zfs_key.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
1 change: 1 addition & 0 deletions module/zfs/zcp_get.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down
5 changes: 4 additions & 1 deletion tests/zfs-tests/cmd/draid.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions tests/zfs-tests/cmd/mkfile.c
Original file line number Diff line number Diff line change
Expand Up @@ -276,5 +276,9 @@ main(int argc, char **argv)
argv++;
argc--;
}

if (buf)
free(buf);

return (errors);
}

0 comments on commit f7bda2d

Please sign in to comment.