From c8b58f9128dd1e4b9424d79d22f5ae50a8bff54a Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Thu, 26 Dec 2024 14:32:34 -0800 Subject: udp: use nni_aio_start This also moves the close of the UDP socket later, to avoid a potential use after free while the aio's are still in-flight. Unfortunately we cannot unbind cleanly without a hard close. --- src/platform/posix/posix_udp.c | 14 ++++---------- src/platform/windows/win_udp.c | 12 +++--------- 2 files changed, 7 insertions(+), 19 deletions(-) (limited to 'src/platform') diff --git a/src/platform/posix/posix_udp.c b/src/platform/posix/posix_udp.c index ade9e02e..4bb50656 100644 --- a/src/platform/posix/posix_udp.c +++ b/src/platform/posix/posix_udp.c @@ -298,13 +298,10 @@ void nni_plat_udp_recv(nni_plat_udp *udp, nni_aio *aio) { int rv; - if (nni_aio_begin(aio) != 0) { - return; - } + nni_aio_reset(aio); nni_mtx_lock(&udp->udp_mtx); - if ((rv = nni_aio_schedule(aio, nni_plat_udp_cancel, udp)) != 0) { + if (!nni_aio_start(aio, nni_plat_udp_cancel, udp)) { nni_mtx_unlock(&udp->udp_mtx); - nni_aio_finish_error(aio, rv); return; } nni_list_append(&udp->udp_recvq, aio); @@ -322,13 +319,10 @@ void nni_plat_udp_send(nni_plat_udp *udp, nni_aio *aio) { int rv; - if (nni_aio_begin(aio) != 0) { - return; - } + nni_aio_reset(aio); nni_mtx_lock(&udp->udp_mtx); - if ((rv = nni_aio_schedule(aio, nni_plat_udp_cancel, udp)) != 0) { + if (!nni_aio_start(aio, nni_plat_udp_cancel, udp)) { nni_mtx_unlock(&udp->udp_mtx); - nni_aio_finish_error(aio, rv); return; } nni_list_append(&udp->udp_sendq, aio); diff --git a/src/platform/windows/win_udp.c b/src/platform/windows/win_udp.c index c1c7ef21..c74b3f77 100644 --- a/src/platform/windows/win_udp.c +++ b/src/platform/windows/win_udp.c @@ -122,9 +122,7 @@ nni_plat_udp_send(nni_plat_udp *u, nni_aio *aio) int rv; DWORD nsent; - if (nni_aio_begin(aio) != 0) { - return; - } + nni_aio_reset(aio); sa = nni_aio_get_input(aio, 0); if ((tolen = nni_win_nn2sockaddr(&to, sa)) < 0) { nni_aio_finish_error(aio, NNG_EADDRINVAL); @@ -280,19 +278,15 @@ again: void nni_plat_udp_recv(nni_plat_udp *u, nni_aio *aio) { - int rv; - if (nni_aio_begin(aio) != 0) { - return; - } + nni_aio_reset(aio); nni_mtx_lock(&u->lk); if (u->closed) { nni_mtx_unlock(&u->lk); nni_aio_finish_error(aio, NNG_ECLOSED); return; } - if ((rv = nni_aio_schedule(aio, udp_recv_cancel, u)) != 0) { + if (!nni_aio_start(aio, udp_recv_cancel, u)) { nni_mtx_unlock(&u->lk); - nni_aio_finish_error(aio, rv); return; } nni_list_append(&u->rxq, aio); -- cgit v1.2.3-70-g09d2