svn commit: r337184 - vendor/illumos/dist/lib/libzfs/common

Alexander Motin mav at FreeBSD.org
Thu Aug 2 21:24:06 UTC 2018


Author: mav
Date: Thu Aug  2 21:24:04 2018
New Revision: 337184
URL: https://svnweb.freebsd.org/changeset/base/337184

Log:
  9457 libzfs_import.c:add_config() has a memory leak
  
  A memory leak occurs on lines 209 and 213 because the config is not freed
  in the error case.  The interface to add_config() seems less than ideal -
  it would be better if it copied any data necessary from the config and the
  caller freed it.
  
  illumos/illumos-gate at ddfe901b12348d31c500fb57f9174e88860a4061
  
  Reviewed by: Matt Ahrens <matt at delphix.com>
  Reviewed by: Serapheim Dimitropoulos <serapheim.dimitro at delphix.com>
  Approved by: Robert Mustacchi <rm at joyent.com>
  Author:     sara hartse <sara.hartse at delphix.com>

Modified:
  vendor/illumos/dist/lib/libzfs/common/libzfs_import.c

Modified: vendor/illumos/dist/lib/libzfs/common/libzfs_import.c
==============================================================================
--- vendor/illumos/dist/lib/libzfs/common/libzfs_import.c	Thu Aug  2 21:19:35 2018	(r337183)
+++ vendor/illumos/dist/lib/libzfs/common/libzfs_import.c	Thu Aug  2 21:24:04 2018	(r337184)
@@ -33,7 +33,7 @@
  * ZFS label of each device.  If we successfully read the label, then we
  * organize the configuration information in the following hierarchy:
  *
- * 	pool guid -> toplevel vdev guid -> label txg
+ *	pool guid -> toplevel vdev guid -> label txg
  *
  * Duplicate entries matching this same tuple will be discarded.  Once we have
  * examined every device, we pick the best label txg config for each toplevel
@@ -217,7 +217,6 @@ add_config(libzfs_handle_t *hdl, pool_list_t *pl, cons
 		ne->ne_next = pl->names;
 		pl->names = ne;
 
-		nvlist_free(config);
 		return (0);
 	}
 
@@ -237,7 +236,6 @@ add_config(libzfs_handle_t *hdl, pool_list_t *pl, cons
 	    &top_guid) != 0 ||
 	    nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_TXG,
 	    &txg) != 0 || txg == 0) {
-		nvlist_free(config);
 		return (0);
 	}
 
@@ -252,7 +250,6 @@ add_config(libzfs_handle_t *hdl, pool_list_t *pl, cons
 
 	if (pe == NULL) {
 		if ((pe = zfs_alloc(hdl, sizeof (pool_entry_t))) == NULL) {
-			nvlist_free(config);
 			return (-1);
 		}
 		pe->pe_guid = pool_guid;
@@ -271,7 +268,6 @@ add_config(libzfs_handle_t *hdl, pool_list_t *pl, cons
 
 	if (ve == NULL) {
 		if ((ve = zfs_alloc(hdl, sizeof (vdev_entry_t))) == NULL) {
-			nvlist_free(config);
 			return (-1);
 		}
 		ve->ve_guid = top_guid;
@@ -291,15 +287,12 @@ add_config(libzfs_handle_t *hdl, pool_list_t *pl, cons
 
 	if (ce == NULL) {
 		if ((ce = zfs_alloc(hdl, sizeof (config_entry_t))) == NULL) {
-			nvlist_free(config);
 			return (-1);
 		}
 		ce->ce_txg = txg;
-		ce->ce_config = config;
+		ce->ce_config = fnvlist_dup(config);
 		ce->ce_next = ve->ve_configs;
 		ve->ve_configs = ce;
-	} else {
-		nvlist_free(config);
 	}
 
 	/*
@@ -1235,9 +1228,7 @@ zpool_find_import_impl(libzfs_handle_t *hdl, importarg
 					    &this_guid) == 0 &&
 					    iarg->guid == this_guid;
 				}
-				if (!matched) {
-					nvlist_free(config);
-				} else {
+				if (matched) {
 					/*
 					 * use the non-raw path for the config
 					 */
@@ -1247,6 +1238,7 @@ zpool_find_import_impl(libzfs_handle_t *hdl, importarg
 					    config) != 0)
 						config_failed = B_TRUE;
 				}
+				nvlist_free(config);
 			}
 			free(slice->rn_name);
 			free(slice);


More information about the svn-src-all mailing list