diff options
| author | Garrett D'Amore <garrett@damore.org> | 2018-08-11 21:14:02 +0500 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2018-08-11 21:07:24 +0300 |
| commit | 0bb233a032152ff99f2d11b5f82aa31d88b031b0 (patch) | |
| tree | 21afb0c6b4b2243620993a2b02508921fa54de8b /src | |
| parent | 79e1c3f5a2d96e5893fd5153a4a944d5a704d4ad (diff) | |
| download | nng-0bb233a032152ff99f2d11b5f82aa31d88b031b0.tar.gz nng-0bb233a032152ff99f2d11b5f82aa31d88b031b0.tar.bz2 nng-0bb233a032152ff99f2d11b5f82aa31d88b031b0.zip | |
fixes #640 IPC leaks found
Diffstat (limited to 'src')
| -rw-r--r-- | src/transport/ipc/ipc.c | 25 |
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; |
