From 83702c957710989d32ff5f19dbc81a5703802d5a Mon Sep 17 00:00:00 2001 From: Leonid Evdokimov Date: Thu, 14 Apr 2016 01:47:34 +0300 Subject: [PATCH] Fix cleanup order to avoid EBADF from epoll_ctl --- redsocks.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/redsocks.c b/redsocks.c index e09e4194..21d85278 100644 --- a/redsocks.c +++ b/redsocks.c @@ -749,23 +749,28 @@ void redsocks_drop_client(redsocks_client *client) redsocks_close(pump->reply.write); // redsocks_close MAY log error if some of events was not properly initialized + int fd = -1; if (event_initialized(&pump->client_read)) { - int fd = event_get_fd(&pump->client_read); + fd = event_get_fd(&pump->client_read); redsocks_event_del(&pump->c, &pump->client_read); - redsocks_close(fd); } if (event_initialized(&pump->client_write)) { redsocks_event_del(&pump->c, &pump->client_write); } + if (fd != -1) + redsocks_close(fd); + fd = -1; if (event_initialized(&pump->relay_read)) { - int fd = event_get_fd(&pump->relay_read); + fd = event_get_fd(&pump->relay_read); redsocks_event_del(&pump->c, &pump->relay_read); - redsocks_close(fd); } if (event_initialized(&pump->relay_write)) { redsocks_event_del(&pump->c, &pump->relay_write); } + if (fd != -1) { + redsocks_close(fd); + } } list_del(&client->list);