65 lines
1.9 KiB
Diff
65 lines
1.9 KiB
Diff
From 5fad40a007b61092161d1e4fd0ffbbc3e7b8ba6c Mon Sep 17 00:00:00 2001
|
|
From: Michal Kubecek <mkubecek@suse.cz>
|
|
Date: Mon, 9 Nov 2020 13:30:57 +0100
|
|
Subject: [PATCH 24/26] netlink: fix leaked instances of struct nl_socket
|
|
|
|
Valgrind detected memory leaks caused by missing cleanup of netlink
|
|
context's ethnl_socket, ethnl2_socket and rtnl_socket. Also, contrary to
|
|
its description, nlsock_done() does not free struct nl_socket itself.
|
|
Fix nlsock_done() to free the structure and use it to dispose of sockets
|
|
pointed to by struct nl_context members.
|
|
|
|
Fixes: 50efb3cdd2bb ("netlink: netlink socket wrapper and helpers")
|
|
Fixes: 87307c30724d ("netlink: initialize ethtool netlink socket")
|
|
Fixes: 7f3585b22a4b ("netlink: add handler for permaddr (-P)")
|
|
Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
|
|
(cherry picked from commit d85f57499d75da5c98b73652488f3f62c6f6d8ea)
|
|
---
|
|
netlink/netlink.c | 11 ++++++++---
|
|
netlink/nlsock.c | 3 +++
|
|
2 files changed, 11 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/netlink/netlink.c b/netlink/netlink.c
|
|
index 2a12bb8b1759..5677274c2fce 100644
|
|
--- a/netlink/netlink.c
|
|
+++ b/netlink/netlink.c
|
|
@@ -281,11 +281,16 @@ out_free:
|
|
|
|
static void netlink_done(struct cmd_context *ctx)
|
|
{
|
|
- if (!ctx->nlctx)
|
|
+ struct nl_context *nlctx = ctx->nlctx;
|
|
+
|
|
+ if (!nlctx)
|
|
return;
|
|
|
|
- free(ctx->nlctx->ops_info);
|
|
- free(ctx->nlctx);
|
|
+ nlsock_done(nlctx->ethnl_socket);
|
|
+ nlsock_done(nlctx->ethnl2_socket);
|
|
+ nlsock_done(nlctx->rtnl_socket);
|
|
+ free(nlctx->ops_info);
|
|
+ free(nlctx);
|
|
ctx->nlctx = NULL;
|
|
cleanup_all_strings();
|
|
}
|
|
diff --git a/netlink/nlsock.c b/netlink/nlsock.c
|
|
index ef31d8c33b29..0ec2738d81d2 100644
|
|
--- a/netlink/nlsock.c
|
|
+++ b/netlink/nlsock.c
|
|
@@ -395,8 +395,11 @@ out_msgbuff:
|
|
*/
|
|
void nlsock_done(struct nl_socket *nlsk)
|
|
{
|
|
+ if (!nlsk)
|
|
+ return;
|
|
if (nlsk->sk)
|
|
mnl_socket_close(nlsk->sk);
|
|
msgbuff_done(&nlsk->msgbuff);
|
|
memset(nlsk, '\0', sizeof(*nlsk));
|
|
+ free(nlsk);
|
|
}
|
|
--
|
|
2.26.2
|
|
|