Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 21 Sep 2017 10:16:44 +0000 (UTC)
From:      Mariusz Zaborski <oshogbo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r323858 - head/sys/contrib/libnv
Message-ID:  <201709211016.v8LAGig1073069@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: oshogbo
Date: Thu Sep 21 10:16:44 2017
New Revision: 323858
URL: https://svnweb.freebsd.org/changeset/base/323858

Log:
  IMHO it is possible that failure will be treated as success because we don't
  initialize nvp on every loop iteration and the code under 'fail'(!) label
  detects success by checking of nvp != NULL.
  
  Submitted by:	pjd@
  MFC after:	1 month
  Sponsored by:   Wheel Systems

Modified:
  head/sys/contrib/libnv/nvpair.c

Modified: head/sys/contrib/libnv/nvpair.c
==============================================================================
--- head/sys/contrib/libnv/nvpair.c	Thu Sep 21 10:16:25 2017	(r323857)
+++ head/sys/contrib/libnv/nvpair.c	Thu Sep 21 10:16:44 2017	(r323858)
@@ -1690,11 +1690,10 @@ nvpair_move_number_array(const char *name, uint64_t *v
 nvpair_t *
 nvpair_move_nvlist_array(const char *name, nvlist_t **value, size_t nitems)
 {
+	nvpair_t *parent;
 	unsigned int ii;
-	nvpair_t *nvp;
 	int flags;
 
-	nvp = NULL;
 	if (value == NULL || nitems == 0) {
 		ERRNO_SET(EINVAL);
 		return (NULL);
@@ -1707,6 +1706,8 @@ nvpair_move_nvlist_array(const char *name, nvlist_t **
 			goto fail;
 		}
 		if (ii > 0) {
+			nvpair_t *nvp;
+
 			nvp = nvpair_allocv(" ", NV_TYPE_NVLIST,
 			    (uint64_t)(uintptr_t)value[ii], 0, 0);
 			if (nvp == NULL)
@@ -1717,25 +1718,27 @@ nvpair_move_nvlist_array(const char *name, nvlist_t **
 	flags = nvlist_flags(value[nitems - 1]) | NV_FLAG_IN_ARRAY;
 	nvlist_set_flags(value[nitems - 1], flags);
 
-	nvp = nvpair_allocv(name, NV_TYPE_NVLIST_ARRAY,
+	parent = nvpair_allocv(name, NV_TYPE_NVLIST_ARRAY,
 	    (uint64_t)(uintptr_t)value, 0, nitems);
+	if (parent == NULL)
+		goto fail;
+
+	for (ii = 0; ii < nitems; ii++)
+		nvlist_set_parent(value[ii], parent);
+
+	return (parent);
 fail:
-	if (nvp == NULL) {
-		ERRNO_SAVE();
-		for (ii = 0; ii < nitems; ii++) {
-			if (value[ii] != NULL &&
-			    nvlist_get_pararr(value[ii], NULL) != NULL) {
-				nvlist_destroy(value[ii]);
-			}
+	ERRNO_SAVE();
+	for (ii = 0; ii < nitems; ii++) {
+		if (value[ii] != NULL &&
+		    nvlist_get_pararr(value[ii], NULL) != NULL) {
+			nvlist_destroy(value[ii]);
 		}
-		nv_free(value);
-		ERRNO_RESTORE();
-	} else {
-		for (ii = 0; ii < nitems; ii++)
-			nvlist_set_parent(value[ii], nvp);
 	}
+	nv_free(value);
+	ERRNO_RESTORE();
 
-	return (nvp);
+	return (NULL);
 }
 
 #ifndef _KERNEL



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201709211016.v8LAGig1073069>