Author: markj
Date: Mon Sep 24 14:50:44 2018
New Revision: 338905
URL: https://svnweb.freebsd.org/changeset/base/338905

Log:
  MFC r338724:
  Fix an nvpair leak in vdev_geom_read_config().
  
  PR:   230704

Modified:
  stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
==============================================================================
--- stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c        
Mon Sep 24 14:48:27 2018        (r338904)
+++ stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c        
Mon Sep 24 14:50:44 2018        (r338905)
@@ -417,9 +417,10 @@ vdev_geom_io(struct g_consumer *cp, int *cmds, void **
  * least one valid label was found.
  */
 static int
-vdev_geom_read_config(struct g_consumer *cp, nvlist_t **config)
+vdev_geom_read_config(struct g_consumer *cp, nvlist_t **configp)
 {
        struct g_provider *pp;
+       nvlist_t *config;
        vdev_phys_t *vdev_lists[VDEV_LABELS];
        char *buf;
        size_t buflen;
@@ -444,7 +445,6 @@ vdev_geom_read_config(struct g_consumer *cp, nvlist_t 
 
        buflen = sizeof(vdev_lists[0]->vp_nvlist);
 
-       *config = NULL;
        /* Create all of the IO requests */
        for (l = 0; l < VDEV_LABELS; l++) {
                cmds[l] = BIO_READ;
@@ -460,6 +460,7 @@ vdev_geom_read_config(struct g_consumer *cp, nvlist_t 
            VDEV_LABELS);
 
        /* Parse the labels */
+       config = *configp = NULL;
        nlabels = 0;
        for (l = 0; l < VDEV_LABELS; l++) {
                if (errors[l] != 0)
@@ -467,24 +468,26 @@ vdev_geom_read_config(struct g_consumer *cp, nvlist_t 
 
                buf = vdev_lists[l]->vp_nvlist;
 
-               if (nvlist_unpack(buf, buflen, config, 0) != 0)
+               if (nvlist_unpack(buf, buflen, &config, 0) != 0)
                        continue;
 
-               if (nvlist_lookup_uint64(*config, ZPOOL_CONFIG_POOL_STATE,
+               if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE,
                    &state) != 0 || state > POOL_STATE_L2CACHE) {
-                       nvlist_free(*config);
-                       *config = NULL;
+                       nvlist_free(config);
                        continue;
                }
 
                if (state != POOL_STATE_SPARE &&
                    state != POOL_STATE_L2CACHE &&
-                   (nvlist_lookup_uint64(*config, ZPOOL_CONFIG_POOL_TXG,
+                   (nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_TXG,
                    &txg) != 0 || txg == 0)) {
-                       nvlist_free(*config);
-                       *config = NULL;
+                       nvlist_free(config);
                        continue;
                }
+
+               if (*configp != NULL)
+                       nvlist_free(*configp);
+               *configp = config;
 
                nlabels++;
        }
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to