summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--exec.c7
-rw-r--r--plugin.c9
2 files changed, 12 insertions, 4 deletions
diff --git a/exec.c b/exec.c
index eb52966..f490ad7 100644
--- a/exec.c
+++ b/exec.c
@@ -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();
}
diff --git a/plugin.c b/plugin.c
index 877345d..bf7c74d 100644
--- a/plugin.c
+++ b/plugin.c
@@ -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)