Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/external/bsd/libnv/dist libnv: fix multiple memory leaks.
details: https://anonhg.NetBSD.org/src/rev/8a5de469ff6f
branches: trunk
changeset: 996888:8a5de469ff6f
user: rmind <rmind%NetBSD.org@localhost>
date: Tue Feb 12 12:49:23 2019 +0000
description:
libnv: fix multiple 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() users.
Found by clang/gcc ASAN. These fixes have been contributed to the
upstream (FreeBSD) repository.
diffstat:
sys/external/bsd/libnv/dist/nv_impl.h | 3 ++-
sys/external/bsd/libnv/dist/nvlist.c | 13 +++++++++++--
sys/external/bsd/libnv/dist/nvpair.c | 19 +++++++++++++------
3 files changed, 26 insertions(+), 9 deletions(-)
diffs (98 lines):
diff -r ab0eccfc9323 -r 8a5de469ff6f sys/external/bsd/libnv/dist/nv_impl.h
--- a/sys/external/bsd/libnv/dist/nv_impl.h Tue Feb 12 10:16:58 2019 +0000
+++ b/sys/external/bsd/libnv/dist/nv_impl.h Tue Feb 12 12:49:23 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: nv_impl.h,v 1.5 2018/09/23 19:07:10 rmind Exp $ */
+/* $NetBSD: nv_impl.h,v 1.6 2019/02/12 12:49:23 rmind Exp $ */
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
@@ -125,6 +125,7 @@
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);
diff -r ab0eccfc9323 -r 8a5de469ff6f sys/external/bsd/libnv/dist/nvlist.c
--- a/sys/external/bsd/libnv/dist/nvlist.c Tue Feb 12 10:16:58 2019 +0000
+++ b/sys/external/bsd/libnv/dist/nvlist.c Tue Feb 12 12:49:23 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: nvlist.c,v 1.6 2018/09/22 17:13:30 rmind Exp $ */
+/* $NetBSD: nvlist.c,v 1.7 2019/02/12 12:49:23 rmind Exp $ */
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
@@ -36,7 +36,7 @@
#ifdef __FreeBSD__
__FBSDID("$FreeBSD: head/sys/contrib/libnv/nvlist.c 335347 2018-06-18 22:57:32Z oshogbo $");
#else
-__RCSID("$NetBSD: nvlist.c,v 1.6 2018/09/22 17:13:30 rmind Exp $");
+__RCSID("$NetBSD: nvlist.c,v 1.7 2019/02/12 12:49:23 rmind Exp $");
#endif
#include <sys/param.h>
@@ -269,6 +269,15 @@
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)
{
diff -r ab0eccfc9323 -r 8a5de469ff6f sys/external/bsd/libnv/dist/nvpair.c
--- a/sys/external/bsd/libnv/dist/nvpair.c Tue Feb 12 10:16:58 2019 +0000
+++ b/sys/external/bsd/libnv/dist/nvpair.c Tue Feb 12 12:49:23 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: nvpair.c,v 1.3 2018/09/08 14:32:25 christos Exp $ */
+/* $NetBSD: nvpair.c,v 1.4 2019/02/12 12:49:23 rmind Exp $ */
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
@@ -36,7 +36,7 @@
#ifdef __FreeBSD__
__FBSDID("$FreeBSD: head/sys/contrib/libnv/nvpair.c 335382 2018-06-19 18:43:02Z lwhsu $");
#else
-__RCSID("$NetBSD: nvpair.c,v 1.3 2018/09/08 14:32:25 christos Exp $");
+__RCSID("$NetBSD: nvpair.c,v 1.4 2019/02/12 12:49:23 rmind Exp $");
#endif
#include <sys/param.h>
@@ -251,8 +251,16 @@
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);
}
}
@@ -1216,8 +1224,7 @@
if (len < 0)
return (NULL);
nvp = nvpair_create_string(name, str);
- if (nvp == NULL)
- nv_free(str);
+ nv_free(str);
return (nvp);
}
#endif
Home |
Main Index |
Thread Index |
Old Index