From e24e62a948e1519fb4c1bfc40d9d51e36fbbe63e Mon Sep 17 00:00:00 2001 From: liaoyuxiangqin Date: Sat, 30 Jul 2016 11:03:01 +0800 Subject: [PATCH] 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 Signed-off-by: Brian Behlendorf Closes #4910 --- lib/libzfs/libzfs_import.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/libzfs/libzfs_import.c b/lib/libzfs/libzfs_import.c index fb3525848..edc0adcee 100644 --- a/lib/libzfs/libzfs_import.c +++ b/lib/libzfs/libzfs_import.c @@ -641,11 +641,14 @@ add_config(libzfs_handle_t *hdl, pool_list_t *pl, const char *path, &state) == 0 && (state == POOL_STATE_SPARE || state == POOL_STATE_L2CACHE) && 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); + } if ((ne->ne_name = zfs_strdup(hdl, path)) == NULL) { free(ne); + nvlist_free(config); return (-1); } 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_next = pl->names; pl->names = ne; + nvlist_free(config); return (0); }