util-linux/backport-lsns-fix-the-memory-leak.patch

101 lines
3.3 KiB
Diff
Raw Normal View History

From 395f3baed6df1eb736c872ecaa3aa2f05c5dc111 Mon Sep 17 00:00:00 2001
From: lishengyu <lishengyu@uniontech.com>
Date: Thu, 23 Jun 2022 14:02:49 +0800
Subject: [PATCH] lsns: fix the memory leak.
==28129== 96 bytes in 3 blocks are possibly lost in loss record 1 of 4
==28129== at 0x4837B65: calloc (vg_replace_malloc.c:752)
==28129== by 0x405C83: xcalloc (xalloc.h:60)
==28129== by 0x405C83: netnsid_cache_add (lsns.c:389)
==28129== by 0x405C83: get_netnsid (lsns.c:486)
==28129== by 0x405C83: read_process (lsns.c:549)
==28129== by 0x403FB4: read_processes (lsns.c:586)
==28129== by 0x403FB4: main (lsns.c:1417)
==28129==
==28129== 119,664 (384 direct, 119,280 indirect) bytes in 1 blocks are definitely lost in loss record 4 of 4
==28129== at 0x4837B65: calloc (vg_replace_malloc.c:752)
==28129== by 0x4055F5: xcalloc (xalloc.h:60)
==28129== by 0x4055F5: read_process (lsns.c:516)
==28129== by 0x403FB4: read_processes (lsns.c:586)
==28129== by 0x403FB4: main (lsns.c:1417)
---
include/list.h | 19 +++++++++++++++++++
sys-utils/lsns.c | 25 +++++++++++++++++++++++++
2 files changed, 44 insertions(+)
diff --git a/include/list.h b/include/list.h
index 96c84e5..b6bbbdd 100644
--- a/include/list.h
+++ b/include/list.h
@@ -208,6 +208,25 @@ _INLINE_ void list_splice(struct list_head *list, struct list_head *head)
for (pos = (head)->next, pnext = pos->next; pos != (head); \
pos = pnext, pnext = pos->next)
+/**
+ * list_free - remove all entries from list and call freefunc()
+ * for each entry
+ * @head: the head for your list
+ * @type: the type of the struct this is embedded in.
+ * @member: the name of the list_struct within the struct.
+ * @freefunc: the list entry deallocator
+ */
+#define list_free(head, type, member, freefunc) \
+ do { \
+ struct list_head *__p, *__pnext; \
+ \
+ list_for_each_safe (__p, __pnext, (head)) { \
+ type *__elt = list_entry(__p, type, member); \
+ list_del(__p); \
+ freefunc(__elt); \
+ } \
+ } while (0)
+
_INLINE_ size_t list_count_entries(struct list_head *head)
{
struct list_head *pos;
diff --git a/sys-utils/lsns.c b/sys-utils/lsns.c
index 8e25ff1..baa80bd 100644
--- a/sys-utils/lsns.c
+++ b/sys-utils/lsns.c
@@ -953,6 +953,28 @@ static int show_namespace_processes(struct lsns *ls, struct lsns_namespace *ns)
return 0;
}
+static void free_lsns_process(struct lsns_process *lsns_p)
+{
+ free(lsns_p);
+}
+
+static void free_netnsid_caches(struct netnsid_cache *cache)
+{
+ free(cache);
+}
+
+static void free_lsns_namespace(struct lsns_namespace *lsns_n)
+{
+ free(lsns_n);
+}
+
+static void free_all(struct lsns *ls)
+{
+ list_free(&ls->processes, struct lsns_process, processes, free_lsns_process);
+ list_free(&netnsids_cache, struct netnsid_cache, netnsids, free_netnsid_caches);
+ list_free(&ls->namespaces, struct lsns_namespace, namespaces, free_lsns_namespace);
+}
+
static void __attribute__((__noreturn__)) usage(void)
{
FILE *out = stdout;
@@ -1162,5 +1184,8 @@ int main(int argc, char *argv[])
if (netlink_fd >= 0)
close(netlink_fd);
free_idcache(uid_cache);
+
+ free_all(&ls);
+
return r == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
--
2.27.0