Skip to content

Commit 6f762f8

Browse files
authored
Prevent double-free when closing an interface event listener (#276)
* prevent double-free when closing an interface event listener * return UV_EINVAL if udx_interface_event_close is called on a already-closed interface listener
1 parent b65bf3c commit 6f762f8

File tree

2 files changed

+8
-1
lines changed

2 files changed

+8
-1
lines changed

include/udx.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,8 @@ struct udx_interface_event_s {
513513
uv_loop_t *loop;
514514
udx_t *udx;
515515

516+
bool closing;
517+
516518
udx_interface_event_t *prev;
517519
udx_interface_event_t *next;
518520

src/udx.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2667,7 +2667,7 @@ _stream_on_destroy_send (uv_udp_send_t *req, int status) {
26672667
int
26682668
udx_stream_destroy (udx_stream_t *stream) {
26692669
if (stream->status & UDX_STREAM_CLOSED) {
2670-
debug_printf("udx: closing already closed stream %u", stream->local_id);
2670+
debug_printf("udx: closing already closed stream %u\n", stream->local_id);
26712671
return 0;
26722672
}
26732673

@@ -2827,6 +2827,7 @@ udx_interface_event_init (udx_t *udx, udx_interface_event_t *handle, udx_interfa
28272827
handle->loop = udx->loop;
28282828
handle->sorted = false;
28292829
handle->on_close = cb;
2830+
handle->closing = false;
28302831

28312832
int err = uv_interface_addresses(&(handle->addrs), &(handle->addrs_len));
28322833
if (err < 0) return err;
@@ -2860,6 +2861,10 @@ udx_interface_event_stop (udx_interface_event_t *handle) {
28602861

28612862
int
28622863
udx_interface_event_close (udx_interface_event_t *handle) {
2864+
if (handle->closing) {
2865+
return UV_EINVAL;
2866+
}
2867+
handle->closing = true;
28632868
handle->on_event = NULL;
28642869

28652870
uv_free_interface_addresses(handle->addrs, handle->addrs_len);

0 commit comments

Comments
 (0)