aboutsummaryrefslogtreecommitdiff
path: root/src/transport
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2018-08-11 21:14:02 +0500
committerGarrett D'Amore <garrett@damore.org>2018-08-11 21:07:24 +0300
commit0bb233a032152ff99f2d11b5f82aa31d88b031b0 (patch)
tree21afb0c6b4b2243620993a2b02508921fa54de8b /src/transport
parent79e1c3f5a2d96e5893fd5153a4a944d5a704d4ad (diff)
downloadnng-0bb233a032152ff99f2d11b5f82aa31d88b031b0.tar.gz
nng-0bb233a032152ff99f2d11b5f82aa31d88b031b0.tar.bz2
nng-0bb233a032152ff99f2d11b5f82aa31d88b031b0.zip
fixes #640 IPC leaks found
Diffstat (limited to 'src/transport')
-rw-r--r--src/transport/ipc/ipc.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/transport/ipc/ipc.c b/src/transport/ipc/ipc.c
index c40880c0..9899a262 100644
--- a/src/transport/ipc/ipc.c
+++ b/src/transport/ipc/ipc.c
@@ -200,6 +200,7 @@ ipctran_pipe_conn_cb(void *arg)
if (uaio != NULL) {
nni_aio_finish_error(uaio, rv);
}
+ ipctran_pipe_reap(p);
return;
}
p->conn = nni_aio_get_output(aio, 0);
@@ -802,11 +803,17 @@ ipctran_ep_connect(void *arg, nni_aio *aio)
return;
}
nni_mtx_lock(&ep->mtx);
- if (((rv = ipctran_pipe_init(&p, ep)) != 0) ||
- ((rv = nni_aio_schedule(aio, ipctran_pipe_conn_cancel, p)) != 0)) {
+ if ((rv = ipctran_pipe_init(&p, ep)) != 0) {
nni_mtx_unlock(&ep->mtx);
nni_aio_finish_error(aio, rv);
- ipctran_pipe_reap(p);
+ return;
+ }
+ if ((rv = nni_aio_schedule(aio, ipctran_pipe_conn_cancel, p)) != 0) {
+ nni_list_remove(&ep->pipes, p);
+ p->ep = NULL;
+ nni_mtx_unlock(&ep->mtx);
+ nni_aio_finish_error(aio, rv);
+ ipctran_pipe_fini(p);
return;
}
p->useraio = aio;
@@ -862,11 +869,17 @@ ipctran_ep_accept(void *arg, nni_aio *aio)
return;
}
nni_mtx_lock(&ep->mtx);
- if (((rv = ipctran_pipe_init(&p, ep)) != 0) ||
- ((rv = nni_aio_schedule(aio, ipctran_pipe_conn_cancel, p)) != 0)) {
+ if ((rv = ipctran_pipe_init(&p, ep)) != 0) {
nni_mtx_unlock(&ep->mtx);
nni_aio_finish_error(aio, rv);
- ipctran_pipe_reap(p);
+ return;
+ }
+ if ((rv = nni_aio_schedule(aio, ipctran_pipe_conn_cancel, p)) != 0) {
+ nni_list_remove(&ep->pipes, p);
+ p->ep = NULL;
+ nni_mtx_unlock(&ep->mtx);
+ nni_aio_finish_error(aio, rv);
+ ipctran_pipe_fini(p);
return;
}
p->useraio = aio;