From 22a632fb88515daaacb2b1610ee8b9dfb38b9fbe Mon Sep 17 00:00:00 2001 From: Bram Matthys Date: Sun, 2 Apr 2023 08:32:51 +0200 Subject: [PATCH] Fix memory leak in RPC module on server disconnect. The "rrpc" moddata was not freed, which contained the list of RPC modules on a remote server. --- src/modules/rpc/rpc.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/modules/rpc/rpc.c b/src/modules/rpc/rpc.c index 1690b9893..b5a8522dc 100644 --- a/src/modules/rpc/rpc.c +++ b/src/modules/rpc/rpc.c @@ -90,6 +90,7 @@ int rpc_handle_server_quit(Client *client, MessageTag *mtags); int rpc_json_expand_client_server(Client *client, int detail, json_t *j, json_t *child); const char *rrpc_md_serialize(ModData *m); void rrpc_md_unserialize(const char *str, ModData *m); +void rrpc_md_free(ModData *m); /* Macros */ #define RPC_PORT(client) ((client->local && client->local->listener) ? client->local->listener->rpc_options : 0) @@ -163,6 +164,7 @@ MOD_INIT() mreq.type = MODDATATYPE_CLIENT; mreq.serialize = rrpc_md_serialize; mreq.unserialize = rrpc_md_unserialize; + mreq.free = rrpc_md_free; mreq.sync = 1; mreq.self_write = 1; rrpc_md = ModDataAdd(modinfo->handle, mreq); @@ -1674,6 +1676,15 @@ void rrpc_md_unserialize(const char *str, ModData *m) } } +void rrpc_md_free(ModData *m) +{ + if (m->ptr) + { + free_nvplist(m->ptr); + m->ptr = NULL; + } +} + int rpc_json_expand_client_server(Client *client, int detail, json_t *j, json_t *child) { NameValuePrioList *nv = RRPCMODULES(client);