plugin: fix leaking invoked method name for exec plugins
authorJo-Philipp Wich <jo@mein.io>
Thu, 17 Oct 2019 09:50:39 +0000 (11:50 +0200)
committerJo-Philipp Wich <jo@mein.io>
Tue, 26 May 2020 14:18:26 +0000 (16:18 +0200)
The invoked method name was separately duplicated from the call_context
structure. The structure itself is eventually freed by rpc_exec_reply()
but the method string it points to is lost after that.

Use calloc_a() instead to allocate the string copy buffer together with
the context structure, to ensure that all involved memory is freed.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 37aa9196b603769ffbff4d0c58f76259a3791384)

plugin.c

index 3740622e8fe9c753a8f2b73df341173b9642079c..fa5f09f932865a0ee1758c277eb95fdc1ef497c6 100644 (file)
--- a/plugin.c
+++ b/plugin.c
@@ -135,14 +135,14 @@ rpc_plugin_call(struct ubus_context *ctx, struct ubus_object *obj,
 {
        int rv = UBUS_STATUS_UNKNOWN_ERROR;
        struct call_context *c;
-       char *plugin;
+       char *plugin, *mptr;
 
-       c = calloc(1, sizeof(*c));
+       c = calloc_a(sizeof(*c), &mptr, strlen(method) + 1);
 
        if (!c)
                goto fail;
 
-       c->method = strdup(method);
+       c->method = strcpy(mptr, method);
        c->input = blobmsg_format_json(msg, true);
        c->tok = json_tokener_new();