From 522f0b93a03f3908ea1ade752c63c4ee045e28a6 Mon Sep 17 00:00:00 2001 From: Matthew Zipkin Date: Sun, 20 Sep 2020 23:53:17 -0400 Subject: [PATCH] pool: set state to CONNECTING before initializing tcp handle This garuntees that if hsk_peer_open() fails, that hsk_peer_close() will call uv_close() before freeing the peer, preventing a race condition where libuv tries to free the connection handle after the peer has been destroyed. --- src/pool.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/pool.c b/src/pool.c index af7009d8..818ca49a 100644 --- a/src/pool.c +++ b/src/pool.c @@ -896,6 +896,8 @@ hsk_peer_open(hsk_peer_t *peer, const hsk_addr_t *addr) { assert(peer && addr); assert(peer->pool && peer->loop && peer->state == HSK_STATE_DISCONNECTED); + peer->state = HSK_STATE_CONNECTING; + hsk_pool_t *pool = (hsk_pool_t *)peer->pool; uv_loop_t *loop = pool->loop; @@ -927,9 +929,6 @@ hsk_peer_open(hsk_peer_t *peer, const hsk_addr_t *addr) { return HSK_EFAILURE; } - peer->state = HSK_STATE_CONNECTING; - - hsk_peer_t *peerIter, *next; uint64_t active = 0; for (peerIter = pool->head; peerIter; peerIter = next) {