svn commit: r343986 - in head: lib/libnv/tests sys/contrib/libnv

Mariusz Zaborski oshogbo at FreeBSD.org
Sun Feb 10 23:28:57 UTC 2019


Author: oshogbo
Date: Sun Feb 10 23:28:55 2019
New Revision: 343986
URL: https://svnweb.freebsd.org/changeset/base/343986

Log:
  libnv: fix memory leaks
  
  nvpair_create_stringv: free the temporary string; this fix affects
  nvlist_add_stringf() and nvlist_add_stringv().
  
  nvpair_remove_nvlist_array (NV_TYPE_NVLIST_ARRAY case): free the chain
  of nvpairs (as resetting it prevents nvlist_destroy() from freeing it).
  Note: freeing the chain in nvlist_destroy() is not sufficient, because
  it would still leak through nvlist_take_nvlist_array().  This affects
  all nvlist_*_nvlist_array() use
  
  Submitted by:	Mindaugas Rasiukevicius <rmind at netbsd.org>
  Reported by:	clang/gcc ASAN
  MFC after:	2 weeks

Modified:
  head/lib/libnv/tests/nvlist_send_recv_test.c
  head/sys/contrib/libnv/nv_impl.h
  head/sys/contrib/libnv/nvlist.c
  head/sys/contrib/libnv/nvpair.c

Modified: head/lib/libnv/tests/nvlist_send_recv_test.c
==============================================================================
--- head/lib/libnv/tests/nvlist_send_recv_test.c	Sun Feb 10 23:07:46 2019	(r343985)
+++ head/lib/libnv/tests/nvlist_send_recv_test.c	Sun Feb 10 23:28:55 2019	(r343986)
@@ -304,6 +304,8 @@ parent(int sock)
 
 	name = nvlist_next(nvl, &type, &cookie);
 	CHECK(name == NULL);
+
+	nvlist_destroy(nvl);
 }
 
 static void

Modified: head/sys/contrib/libnv/nv_impl.h
==============================================================================
--- head/sys/contrib/libnv/nv_impl.h	Sun Feb 10 23:07:46 2019	(r343985)
+++ head/sys/contrib/libnv/nv_impl.h	Sun Feb 10 23:28:55 2019	(r343986)
@@ -103,6 +103,7 @@ bool nvlist_move_nvpair(nvlist_t *nvl, nvpair_t *nvp);
 
 void nvlist_set_parent(nvlist_t *nvl, nvpair_t *parent);
 void nvlist_set_array_next(nvlist_t *nvl, nvpair_t *ele);
+nvpair_t *nvlist_get_array_next_nvpair(nvlist_t *nvl);
 
 const nvpair_t *nvlist_get_nvpair(const nvlist_t *nvl, const char *name);
 

Modified: head/sys/contrib/libnv/nvlist.c
==============================================================================
--- head/sys/contrib/libnv/nvlist.c	Sun Feb 10 23:07:46 2019	(r343985)
+++ head/sys/contrib/libnv/nvlist.c	Sun Feb 10 23:28:55 2019	(r343986)
@@ -247,6 +247,15 @@ nvlist_set_array_next(nvlist_t *nvl, nvpair_t *ele)
 	nvl->nvl_array_next = ele;
 }
 
+nvpair_t *
+nvlist_get_array_next_nvpair(nvlist_t *nvl)
+{
+
+	NVLIST_ASSERT(nvl);
+
+	return (nvl->nvl_array_next);
+}
+
 bool
 nvlist_in_array(const nvlist_t *nvl)
 {

Modified: head/sys/contrib/libnv/nvpair.c
==============================================================================
--- head/sys/contrib/libnv/nvpair.c	Sun Feb 10 23:07:46 2019	(r343985)
+++ head/sys/contrib/libnv/nvpair.c	Sun Feb 10 23:28:55 2019	(r343986)
@@ -229,8 +229,16 @@ nvpair_remove_nvlist_array(nvpair_t *nvp)
 	nvlarray = __DECONST(nvlist_t **,
 	    nvpair_get_nvlist_array(nvp, &count));
 	for (i = 0; i < count; i++) {
-		nvlist_set_array_next(nvlarray[i], NULL);
-		nvlist_set_parent(nvlarray[i], NULL);
+		nvlist_t *nvl;
+		nvpair_t *nnvp;
+
+		nvl = nvlarray[i];
+		nnvp = nvlist_get_array_next_nvpair(nvl);
+		if (nnvp != NULL) {
+			nvpair_free_structure(nnvp);
+		}
+		nvlist_set_array_next(nvl, NULL);
+		nvlist_set_parent(nvl, NULL);
 	}
 }
 
@@ -1193,8 +1201,7 @@ nvpair_create_stringv(const char *name, const char *va
 	if (len < 0)
 		return (NULL);
 	nvp = nvpair_create_string(name, str);
-	if (nvp == NULL)
-		nv_free(str);
+	nv_free(str);
 	return (nvp);
 }
 


More information about the svn-src-head mailing list