diff options
Diffstat (limited to 'src/transport/zerotier')
| -rw-r--r-- | src/transport/zerotier/zerotier.c | 68 |
1 files changed, 51 insertions, 17 deletions
diff --git a/src/transport/zerotier/zerotier.c b/src/transport/zerotier/zerotier.c index 54e402be..f7139b94 100644 --- a/src/transport/zerotier/zerotier.c +++ b/src/transport/zerotier/zerotier.c @@ -1902,6 +1902,7 @@ static void zt_pipe_recv(void *arg, nni_aio *aio) { zt_pipe *p = arg; + int rv; if (nni_aio_begin(aio) != 0) { return; @@ -1912,7 +1913,11 @@ zt_pipe_recv(void *arg, nni_aio *aio) nni_aio_finish_error(aio, NNG_ECLOSED); return; } - nni_aio_schedule(aio, zt_pipe_cancel_recv, p); + if ((rv = nni_aio_schedule(aio, zt_pipe_cancel_recv, p)) != 0) { + nni_mtx_unlock(&zt_lk); + nni_aio_finish_error(aio, rv); + return; + } p->zp_user_rxaio = aio; zt_pipe_dorecv(p); nni_mtx_unlock(&zt_lk); @@ -2049,7 +2054,13 @@ zt_pipe_ping_cb(void *arg) // going to send a ping. (We don't increment the try count // unless we actually do send one though.) if (nni_aio_begin(aio) == 0) { - nni_aio_schedule(aio, zt_pipe_cancel_ping, p); + int rv; + rv = nni_aio_schedule(aio, zt_pipe_cancel_ping, p); + if (rv != 0) { + nni_mtx_unlock(&zt_lk); + nni_aio_finish_error(aio, rv); + return; + } p->zp_ping_active = 1; if (now > (p->zp_last_recv + p->zp_ping_time)) { p->zp_ping_try++; @@ -2081,10 +2092,15 @@ zt_pipe_start(void *arg, nni_aio *aio) p->zp_ping_try = 0; nni_aio_set_timeout(aio, p->zp_ping_time); if (nni_aio_begin(p->zp_ping_aio) == 0) { - nni_aio_schedule( + int rv; + rv = nni_aio_schedule( p->zp_ping_aio, zt_pipe_cancel_ping, p); - p->zp_ping_active = 1; - zt_pipe_send_ping(p); + if (rv != 0) { + nni_aio_finish_error(p->zp_ping_aio, rv); + } else { + p->zp_ping_active = 1; + zt_pipe_send_ping(p); + } } } nni_aio_finish(aio, 0, 0); @@ -2405,12 +2421,17 @@ static void zt_ep_accept(void *arg, nni_aio *aio) { zt_ep *ep = arg; + int rv; if (nni_aio_begin(aio) != 0) { return; } nni_mtx_lock(&zt_lk); - nni_aio_schedule(aio, zt_ep_cancel, ep); + if ((rv = nni_aio_schedule(aio, zt_ep_cancel, ep)) != 0) { + nni_mtx_unlock(&zt_lk); + nni_aio_finish_error(aio, rv); + return; + } nni_aio_list_append(&ep->ze_aios, aio); zt_ep_doaccept(ep); nni_mtx_unlock(&zt_lk); @@ -2486,10 +2507,14 @@ zt_ep_conn_req_cb(void *arg) if (nni_list_first(&ep->ze_aios) != NULL) { nni_aio_set_timeout(aio, ep->ze_conn_time); if (nni_aio_begin(aio) == 0) { - nni_aio_schedule(aio, zt_ep_conn_req_cancel, ep); - ep->ze_creq_active = 1; - ep->ze_creq_try++; - zt_ep_send_conn_req(ep); + rv = nni_aio_schedule(aio, zt_ep_conn_req_cancel, ep); + if (rv != 0) { + nni_aio_finish_error(aio, rv); + } else { + ep->ze_creq_active = 1; + ep->ze_creq_try++; + zt_ep_send_conn_req(ep); + } } } @@ -2523,18 +2548,27 @@ zt_ep_connect(void *arg, nni_aio *aio) if ((ep->ze_raddr >> 24) == 0) { ep->ze_raddr |= (ep->ze_ztn->zn_self << zt_port_shift); } + if ((rv = nni_aio_schedule(aio, zt_ep_cancel, ep)) != 0) { + nni_aio_finish_error(aio, rv); + nni_mtx_unlock(&zt_lk); + return; + } nni_aio_list_append(&ep->ze_aios, aio); ep->ze_running = 1; - nni_aio_schedule(aio, zt_ep_cancel, ep); nni_aio_set_timeout(ep->ze_creq_aio, ep->ze_conn_time); if (nni_aio_begin(ep->ze_creq_aio) == 0) { - nni_aio_schedule(ep->ze_creq_aio, zt_ep_conn_req_cancel, ep); - // Send out the first connect message; if not - // yet attached to network message will be dropped. - ep->ze_creq_try = 1; - ep->ze_creq_active = 1; - zt_ep_send_conn_req(ep); + rv = nni_aio_schedule( + ep->ze_creq_aio, zt_ep_conn_req_cancel, ep); + if (rv != 0) { + nni_aio_finish_error(ep->ze_creq_aio, rv); + } else { + // Send out the first connect message; if not + // yet attached to network message will be dropped. + ep->ze_creq_try = 1; + ep->ze_creq_active = 1; + zt_ep_send_conn_req(ep); + } } nni_mtx_unlock(&zt_lk); } |
