From 323b4702e0a39cb577f27d4887842dc8b62edddb Mon Sep 17 00:00:00 2001 From: James Thomas Date: Tue, 3 Mar 2026 18:38:13 -0500 Subject: [PATCH 1/2] prevent double-free when closing an interface event listener --- include/udx.h | 2 ++ src/udx.c | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/include/udx.h b/include/udx.h index 666eb6b..5dd0554 100644 --- a/include/udx.h +++ b/include/udx.h @@ -513,6 +513,8 @@ struct udx_interface_event_s { uv_loop_t *loop; udx_t *udx; + bool closing; + udx_interface_event_t *prev; udx_interface_event_t *next; diff --git a/src/udx.c b/src/udx.c index 5fded99..d03f28e 100644 --- a/src/udx.c +++ b/src/udx.c @@ -2667,7 +2667,7 @@ _stream_on_destroy_send (uv_udp_send_t *req, int status) { int udx_stream_destroy (udx_stream_t *stream) { if (stream->status & UDX_STREAM_CLOSED) { - debug_printf("udx: closing already closed stream %u", stream->local_id); + debug_printf("udx: closing already closed stream %u\n", stream->local_id); return 0; } @@ -2827,6 +2827,7 @@ udx_interface_event_init (udx_t *udx, udx_interface_event_t *handle, udx_interfa handle->loop = udx->loop; handle->sorted = false; handle->on_close = cb; + handle->closing = false; int err = uv_interface_addresses(&(handle->addrs), &(handle->addrs_len)); if (err < 0) return err; @@ -2860,6 +2861,10 @@ udx_interface_event_stop (udx_interface_event_t *handle) { int udx_interface_event_close (udx_interface_event_t *handle) { + if (handle->closing) { + return 0; + } + handle->closing = true; handle->on_event = NULL; uv_free_interface_addresses(handle->addrs, handle->addrs_len); From 3fc9578d093e455dae3c42b7f621957166518029 Mon Sep 17 00:00:00 2001 From: James Thomas Date: Wed, 4 Mar 2026 01:23:58 -0500 Subject: [PATCH 2/2] return UV_EINVAL if udx_interface_event_close is called on a already-closed interface listener --- src/udx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/udx.c b/src/udx.c index d03f28e..7e2ab71 100644 --- a/src/udx.c +++ b/src/udx.c @@ -2862,7 +2862,7 @@ udx_interface_event_stop (udx_interface_event_t *handle) { int udx_interface_event_close (udx_interface_event_t *handle) { if (handle->closing) { - return 0; + return UV_EINVAL; } handle->closing = true; handle->on_event = NULL;