From c11ca7a1953fa2ab0953a8d52923b2e80f17055f Mon Sep 17 00:00:00 2001 From: Soner Tari Date: Tue, 27 Jun 2017 22:11:10 +0300 Subject: [PATCH] Fix freeing of non-ssl buffer events and fds --- pxyconn.c | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/pxyconn.c b/pxyconn.c index da8d4be..2b1088c 100644 --- a/pxyconn.c +++ b/pxyconn.c @@ -1204,6 +1204,31 @@ bufferevent_free_and_close_fd(struct bufferevent *bev, pxy_conn_ctx_t *ctx) } } +/* + * Free bufferenvent and close underlying socket properly. + * This is for non-OpenSSL bufferevents. + */ +static void +bufferevent_free_and_close_fd_e2(struct bufferevent *bev, pxy_conn_ctx_t *ctx) +{ + evutil_socket_t fd = bufferevent_getfd(bev); + +#ifdef DEBUG_PROXY + if (OPTS_DEBUG(ctx->opts)) { + log_dbg_printf(" %p free_and_close_fd = %d\n", + (void*)bev, fd); + } +#endif /* DEBUG_PROXY */ + + bufferevent_free(bev); /* does not free SSL unless the option + BEV_OPT_CLOSE_ON_FREE was set */ + if (evutil_closesocket(fd) == -1) { + log_dbg_level_printf(LOG_DBG_MODE_FINE, ">----------------------------- bufferevent_free_and_close_fd_e2: evutil_closesocket FAILED, fd=%d\n", fd); + } else { + log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">----------------------------- bufferevent_free_and_close_fd_e2: evutil_closesocket SUCCESS, fd=%d\n", fd); + } +} + /* * Set up a bufferevent structure for either a dst or src connection, * optionally with or without SSL. Sets all callbacks, enables read @@ -1967,7 +1992,7 @@ pxy_conn_free_e2(pxy_conn_ctx_t *ctx, int free) pxy_conn_desc_t *e2dst = &ctx->e2dst; if (e2dst->bev) { log_dbg_level_printf(LOG_DBG_MODE_FINER, ">############################# pxy_conn_free_e2: evutil_closesocket e2dst->bev, fd=%d\n", bufferevent_getfd(e2dst->bev)); - bufferevent_free_and_close_fd(e2dst->bev, ctx); + bufferevent_free_and_close_fd_e2(e2dst->bev, ctx); e2dst->bev = NULL; } @@ -2028,7 +2053,7 @@ pxy_mctx_free(proxy_conn_meta_ctx_t *mctx) pxy_conn_desc_t *e2src = &mctx->parent_ctx->e2src; if (e2src->bev) { log_dbg_level_printf(LOG_DBG_MODE_FINER, ">############################# pxy_mctx_free: evutil_closesocket e2src->bev, fd=%d\n", bufferevent_getfd(e2src->bev)); - bufferevent_free_and_close_fd(e2src->bev, mctx->parent_ctx); + bufferevent_free_and_close_fd_e2(e2src->bev, mctx->parent_ctx); e2src->bev = NULL; } @@ -2089,7 +2114,7 @@ leavefree: pxy_conn_desc_t *e2src = &ctx->e2src; if (e2src->bev) { log_dbg_level_printf(LOG_DBG_MODE_FINER, ">############################# pxy_conn_free: evutil_closesocket e2src->bev, fd=%d\n", bufferevent_getfd(e2src->bev)); - bufferevent_free_and_close_fd(e2src->bev, ctx); + bufferevent_free_and_close_fd_e2(e2src->bev, ctx); e2src->bev = NULL; }