svn commit: r338905 - stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Mark Johnston
markj at FreeBSD.org
Mon Sep 24 14:50:46 UTC 2018
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++;
}
More information about the svn-src-stable-10
mailing list