From a0f6a82a0b6ae1c6ab5d6c3b8a088c3e0e551200 Mon Sep 17 00:00:00 2001 From: Christian Decker Date: Tue, 27 Nov 2018 00:03:52 +0100 Subject: [PATCH] plugin: Make memleak happy List element structs must have the list_node as their first element. Signed-off-by: Christian Decker <@cdecker> --- lightningd/plugin.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/lightningd/plugin.c b/lightningd/plugin.c index cf5981219..d3ea17325 100644 --- a/lightningd/plugin.c +++ b/lightningd/plugin.c @@ -13,6 +13,8 @@ #include struct plugin { + struct list_node list; + pid_t pid; char *cmd; struct io_conn *stdin_conn, *stdout_conn; @@ -32,8 +34,6 @@ struct plugin { /* List of options that this plugin registered */ struct list_head plugin_opts; - struct list_node list; - const char **methods; }; @@ -101,13 +101,13 @@ void plugin_register(struct plugins *plugins, const char* path TAKES) list_add_tail(&plugins->plugins, &p->list); p->plugins = plugins; p->cmd = tal_strdup(p, path); + p->outbuf = NULL; /* FIXME(cdecker): Referring to plugin by their registration number might not be that useful, come up with a naming scheme that makes more sense. */ plugin_count++; p->log = new_log(p, plugins->log_book, "plugin-%zu", plugin_count); - p->log = plugins->log; p->methods = tal_arr(p, const char *, 0); list_head_init(&p->plugin_opts); } @@ -228,6 +228,9 @@ static struct io_plan *plugin_write_json(struct io_conn *conn UNUSED, struct plugin *plugin) { struct json_output *out; + if (plugin->outbuf) + plugin->outbuf = tal_free(plugin->outbuf); + out = list_pop(&plugin->output, struct json_output, list); if (!out) { if (plugin->stop) { @@ -309,6 +312,7 @@ static struct io_plan *plugin_stdout_conn_init(struct io_conn *conn, * the plugin_opt */ static char *plugin_opt_set(const char *arg, struct plugin_opt *popt) { + tal_free(popt->value); popt->value = tal_strdup(popt, arg); return NULL; } @@ -344,13 +348,13 @@ static bool plugin_opt_add(struct plugin *plugin, const char *buffer, buffer + nametok->start); popt->value = NULL; if (defaulttok) { - popt->value = tal_strndup(plugin, buffer + defaulttok->start, + popt->value = tal_strndup(popt, buffer + defaulttok->start, defaulttok->end - defaulttok->start); popt->description = tal_fmt( - plugin, "%.*s (default: %s)", desctok->end - desctok->start, + popt, "%.*s (default: %s)", desctok->end - desctok->start, buffer + desctok->start, popt->value); } else { - popt->description = tal_strndup(plugin, buffer + desctok->start, + popt->description = tal_strndup(popt, buffer + desctok->start, desctok->end - desctok->start); } @@ -544,6 +548,7 @@ void plugins_init(struct plugins *plugins) io_new_conn(p, stdin, plugin_stdin_conn_init, p); plugin_request_send(p, "getmanifest", "[]", plugin_manifest_cb, p); plugins->pending_manifests++; + tal_free(cmd); } if (plugins->pending_manifests > 0) io_loop(NULL, NULL);