diff options
author | Yousong Zhou <yszhou4tech@gmail.com> | 2019-10-21 06:10:27 +0000 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2019-10-29 09:23:22 +0100 |
commit | 02c6e1d08c9abfebae050ebeab5766935e849dc2 (patch) | |
tree | a9ea6f102c13389cf3c66c415a875da80e980f8a | |
parent | cc502635046a2015d07fab5a21edbda7b7b98f38 (diff) | |
download | rpcd-02c6e1d08c9abfebae050ebeab5766935e849dc2.tar.gz |
exec: properly free memory on rpc_exec() error
Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
[fix whitespace]
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r-- | exec.c | 7 | ||||
-rw-r--r-- | plugin.c | 9 |
2 files changed, 12 insertions, 4 deletions
@@ -313,7 +313,7 @@ rpc_exec(const char **args, rpc_exec_write_cb_t in, switch ((pid = fork())) { case -1: - return rpc_errno_status(); + goto fail_fork; case 0: uloop_done(); @@ -372,6 +372,10 @@ rpc_exec(const char **args, rpc_exec_write_cb_t in, return UBUS_STATUS_OK; +fail_fork: + close(epipe[0]); + close(epipe[1]); + fail_epipe: close(opipe[0]); close(opipe[1]); @@ -381,5 +385,6 @@ fail_opipe: close(ipipe[1]); fail_ipipe: + free(c); return rpc_errno_status(); } @@ -161,9 +161,12 @@ rpc_plugin_call(struct ubus_context *ctx, struct ubus_object *obj, c->argv[1] = "call"; c->argv[2] = c->method; - return rpc_exec(c->argv, rpc_plugin_call_stdin_cb, - rpc_plugin_call_stdout_cb, rpc_plugin_call_stderr_cb, - rpc_plugin_call_finish_cb, c, ctx, req); + rv = rpc_exec(c->argv, rpc_plugin_call_stdin_cb, + rpc_plugin_call_stdout_cb, rpc_plugin_call_stderr_cb, + rpc_plugin_call_finish_cb, c, ctx, req); + + if (rv == UBUS_STATUS_OK) + return rv; fail: if (c) |