Fix memory leak in function add_config()

Config of a hot spare or l2cache device will leak memory in function
add_config().  At the start of this function, when dealing with a
config which belongs to a hot spare not currently in use or a l2cache
device the config should be freed.

Signed-off-by: liaoyuxiangqin <guo.yong33@zte.com.cn>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #4910
This commit is contained in:
liaoyuxiangqin 2016-07-30 11:03:01 +08:00 committed by Brian Behlendorf
parent df053d67a9
commit e24e62a948

View File

@ -641,11 +641,14 @@ add_config(libzfs_handle_t *hdl, pool_list_t *pl, const char *path,
&state) == 0 && &state) == 0 &&
(state == POOL_STATE_SPARE || state == POOL_STATE_L2CACHE) && (state == POOL_STATE_SPARE || state == POOL_STATE_L2CACHE) &&
nvlist_lookup_uint64(config, ZPOOL_CONFIG_GUID, &vdev_guid) == 0) { nvlist_lookup_uint64(config, ZPOOL_CONFIG_GUID, &vdev_guid) == 0) {
if ((ne = zfs_alloc(hdl, sizeof (name_entry_t))) == NULL) if ((ne = zfs_alloc(hdl, sizeof (name_entry_t))) == NULL) {
nvlist_free(config);
return (-1); return (-1);
}
if ((ne->ne_name = zfs_strdup(hdl, path)) == NULL) { if ((ne->ne_name = zfs_strdup(hdl, path)) == NULL) {
free(ne); free(ne);
nvlist_free(config);
return (-1); return (-1);
} }
ne->ne_guid = vdev_guid; ne->ne_guid = vdev_guid;
@ -653,6 +656,7 @@ add_config(libzfs_handle_t *hdl, pool_list_t *pl, const char *path,
ne->ne_num_labels = num_labels; ne->ne_num_labels = num_labels;
ne->ne_next = pl->names; ne->ne_next = pl->names;
pl->names = ne; pl->names = ne;
nvlist_free(config);
return (0); return (0);
} }