From e3266cc811c5fb2baf6912f8be66394adf62a977 Mon Sep 17 00:00:00 2001 From: Soner Tari Date: Thu, 6 Jul 2017 15:38:32 +0300 Subject: [PATCH] Fix closing fd2 when uninit, i.e. fd2=0, which was freeing stdin Clean-up and improvements --- proxy.c | 14 +++----------- pxyconn.c | 49 ++++++++++++++++++++++++++++--------------------- pxythrmgr.c | 4 ++-- 3 files changed, 33 insertions(+), 34 deletions(-) diff --git a/proxy.c b/proxy.c index dda402c..08ae5c8 100644 --- a/proxy.c +++ b/proxy.c @@ -199,7 +199,7 @@ proxy_listener_acceptcb(UNUSED struct evconnlistener *listener, { proxy_listener_ctx_t *lctx = arg; - log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! proxy_listener_acceptcb: <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< LOCK\n"); + log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! proxy_listener_acceptcb: fd=%d <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ENTER\n", fd); char *host, *port; if (sys_sockaddr_str(peeraddr, peeraddrlen, &host, &port) != 0) { @@ -214,18 +214,10 @@ proxy_listener_acceptcb(UNUSED struct evconnlistener *listener, mctx->lctx = lctx; mctx->fd = fd; -// log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! proxy_listener_acceptcb: SETTING UP E2, fd=%d, lctx->clisock=%d\n", fd, lctx->clisock); -// -// // @attention Get fd2 before calling pxy_conn_setup() for parent ctx, because the src readcb uses fd2 to build the header line for SSL proxy address -// evutil_socket_t fd2; -// if ((fd2 = privsep_client_opensock_e2(lctx->clisock, lctx->spec)) == -1) { -// log_err_printf("Error opening socket: %s (%i)\n", strerror(errno), errno); -// return; -// } -// mctx->fd2 = fd2; - pxy_conn_ctx_t *parent_ctx = pxy_conn_setup(fd, peeraddr, peeraddrlen, mctx); mctx->parent_ctx = parent_ctx; + + log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! proxy_listener_acceptcb: fd=%d <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< EXIT\n", fd); } /* diff --git a/pxyconn.c b/pxyconn.c index 092a6c4..fcc1f21 100644 --- a/pxyconn.c +++ b/pxyconn.c @@ -2047,11 +2047,13 @@ pxy_conn_free_e2(pxy_conn_ctx_t *ctx, int free) } if (!ctx->mctx->parent_ctx && !ctx->mctx->child_ctx) { - log_dbg_level_printf(LOG_DBG_MODE_FINE, ">############################# pxy_conn_free_e2: FREEING evcl2, pfd=%d, fd2=%d, cfd=%d\n", pfd, ctx->mctx->fd2, fd); if (ctx->mctx->evcl2) { + log_dbg_level_printf(LOG_DBG_MODE_FINE, ">############################# pxy_conn_free_e2: FREEING evcl2, pfd=%d, fd2=%d, cfd=%d\n", pfd, ctx->mctx->fd2, fd); + // @todo Should we use evconnlistener_get_fd() instead of ctx->mctx->fd2? + //evutil_closesocket(evconnlistener_get_fd(ctx->mctx->evcl2)); evconnlistener_free(ctx->mctx->evcl2); + evutil_closesocket(ctx->mctx->fd2); } - evutil_closesocket(ctx->mctx->fd2); log_dbg_level_printf(LOG_DBG_MODE_FINER, ">############################# pxy_conn_free_e2: RELEASING META CTX, fd=%d, parent fd=%d\n", fd, pfd); rv = 2; @@ -2132,11 +2134,11 @@ pxy_conn_free(pxy_conn_ctx_t *ctx) int rv = 1; ctx->mctx->parent_ctx = NULL; if (!ctx->mctx->child_ctx) { - log_dbg_level_printf(LOG_DBG_MODE_FINE, ">############################# pxy_conn_free: FREEING evcl2, pfd=%d, fd2=%d, cfd=%d\n", fd, ctx->mctx->fd2, cfd); if (ctx->mctx->evcl2) { + log_dbg_level_printf(LOG_DBG_MODE_FINE, ">############################# pxy_conn_free: FREEING evcl2, pfd=%d, fd2=%d, cfd=%d\n", fd, ctx->mctx->fd2, cfd); evconnlistener_free(ctx->mctx->evcl2); + evutil_closesocket(ctx->mctx->fd2); } - evutil_closesocket(ctx->mctx->fd2); log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">############################# pxy_conn_free: RELEASING META CTX, fd=%d, child fd=%d\n", fd, cfd); rv = 2; @@ -2175,45 +2177,45 @@ pxy_child_conn_free(pxy_conn_ctx_t *ctx) pxy_conn_desc_t *dst = &ctx->dst; if (dst->bev) { - log_dbg_level_printf(LOG_DBG_MODE_FINER, ">############################# pxy_conn_free_e2: bufferevent_free_and_close_fd dst->bev, fd=%d\n", bufferevent_getfd(dst->bev)); + log_dbg_level_printf(LOG_DBG_MODE_FINER, ">############################# pxy_child_conn_free: bufferevent_free_and_close_fd dst->bev, fd=%d\n", bufferevent_getfd(dst->bev)); bufferevent_free_and_close_fd(dst->bev, ctx); dst->bev = NULL; } pxy_conn_desc_t *e2dst = &ctx->e2dst; if (e2dst->bev) { - log_dbg_level_printf(LOG_DBG_MODE_FINER, ">############################# pxy_conn_free_e2: bufferevent_free_and_close_fd e2dst->bev, fd=%d\n", bufferevent_getfd(e2dst->bev)); + log_dbg_level_printf(LOG_DBG_MODE_FINER, ">############################# pxy_child_conn_free: bufferevent_free_and_close_fd e2dst->bev, fd=%d\n", bufferevent_getfd(e2dst->bev)); bufferevent_free_and_close_fd_e2(e2dst->bev, ctx); e2dst->bev = NULL; } - log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">############################# pxy_conn_free_e2: remove_node\n"); + log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">############################# pxy_child_conn_free: remove_node\n"); remove_child_ctx(ctx, &ctx->mctx->child_ctx); - log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">############################# pxy_conn_free_e2: CHECKING\n"); + log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">############################# pxy_child_conn_free: CHECKING\n"); pxy_conn_ctx_t *current_child_ctx = ctx->mctx->child_ctx; while (current_child_ctx) { - log_dbg_level_printf(LOG_DBG_MODE_FINE, ">############################# pxy_conn_free_e2: NOT NULL CHILD, fd=%d\n", current_child_ctx->fd); + log_dbg_level_printf(LOG_DBG_MODE_FINE, ">############################# pxy_child_conn_free: NOT NULL CHILD, fd=%d\n", current_child_ctx->fd); current_child_ctx = current_child_ctx->child_ctx; } if (!ctx->mctx->parent_ctx && !ctx->mctx->child_ctx) { - log_dbg_level_printf(LOG_DBG_MODE_FINE, ">############################# pxy_conn_free_e2: FREEING evcl2, pfd=%d, fd2=%d, cfd=%d\n", pfd, ctx->mctx->fd2, fd); if (ctx->mctx->evcl2) { + log_dbg_level_printf(LOG_DBG_MODE_FINE, ">############################# pxy_child_conn_free: FREEING evcl2, pfd=%d, fd2=%d, cfd=%d\n", pfd, ctx->mctx->fd2, fd); evconnlistener_free(ctx->mctx->evcl2); + evutil_closesocket(ctx->mctx->fd2); } - evutil_closesocket(ctx->mctx->fd2); - log_dbg_level_printf(LOG_DBG_MODE_FINER, ">############################# pxy_conn_free_e2: RELEASING META CTX, fd=%d, parent fd=%d\n", fd, pfd); + log_dbg_level_printf(LOG_DBG_MODE_FINER, ">############################# pxy_child_conn_free: RELEASING META CTX, fd=%d, parent fd=%d\n", fd, pfd); } else { - log_dbg_level_printf(LOG_DBG_MODE_FINE, ">############################# pxy_conn_free_e2: CANNOT FREE evcl2, pfd=%d, fd2=%d, cfd=%d\n", pfd, ctx->mctx->fd2, fd); + log_dbg_level_printf(LOG_DBG_MODE_FINE, ">############################# pxy_child_conn_free: CANNOT FREE evcl2, pfd=%d, fd2=%d, cfd=%d\n", pfd, ctx->mctx->fd2, fd); } - log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">############################# pxy_conn_free_e2: FREEING CTX, fd=%d, parent fd=%d\n", fd, pfd); + log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">############################# pxy_child_conn_free: FREEING CTX, fd=%d, parent fd=%d\n", fd, pfd); pxy_conn_ctx_free_e2(ctx); - log_dbg_level_printf(LOG_DBG_MODE_FINER, ">############################# pxy_conn_free_e2: FREED CTX, fd=%d, parent fd=%d\n", fd, pfd); + log_dbg_level_printf(LOG_DBG_MODE_FINER, ">############################# pxy_child_conn_free: FREED CTX, fd=%d, parent fd=%d\n", fd, pfd); } void @@ -2249,11 +2251,11 @@ pxy_parent_conn_free(pxy_conn_ctx_t *ctx) ctx->mctx->parent_ctx = NULL; if (!ctx->mctx->child_ctx) { - log_dbg_level_printf(LOG_DBG_MODE_FINE, ">############################# pxy_parent_conn_free: FREEING evcl2, pfd=%d, fd2=%d, cfd=%d\n", fd, ctx->mctx->fd2, cfd); if (ctx->mctx->evcl2) { + log_dbg_level_printf(LOG_DBG_MODE_FINE, ">############################# pxy_parent_conn_free: FREEING evcl2, pfd=%d, fd2=%d, cfd=%d\n", fd, ctx->mctx->fd2, cfd); evconnlistener_free(ctx->mctx->evcl2); + evutil_closesocket(ctx->mctx->fd2); } - evutil_closesocket(ctx->mctx->fd2); log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">############################# pxy_parent_conn_free: RELEASING META CTX, fd=%d, child fd=%d\n", fd, cfd); } else { @@ -2749,6 +2751,10 @@ pxy_connected_enable(struct bufferevent *bev, pxy_conn_ctx_t *ctx, char *event_n dst->bev = NULL; } + // Child connections will use the addr info obtained by the parent connection + ctx->mctx->addrlen = ctx->addrlen; + memcpy(&ctx->mctx->addr, &ctx->addr, ctx->addrlen); + // @attention Defer E2 setup and evcl2 creation until parent init is complete, otherwise (1) causes multithreading issues (proxy_listener_acceptcb running on a different // thread from the conn, and we only have thrmgr mutex), and (2) we need to clean up less upon errors. // evcl2 uses the evbase of the mctx thread, otherwise we would get multithreading issues. @@ -2757,9 +2763,10 @@ pxy_connected_enable(struct bufferevent *bev, pxy_conn_ctx_t *ctx, char *event_n evutil_socket_t fd2; if ((fd2 = privsep_client_opensock_e2(ctx->mctx->lctx->clisock, ctx->mctx->lctx->spec)) == -1) { log_err_printf("Error opening socket: %s (%i)\n", strerror(errno), errno); - return; + return 0; } ctx->mctx->fd2 = fd2; + log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>=================================== pxy_connected_enable: Opened fd2, fd=%d, fd2=%d\n", ctx->mctx->fd, ctx->mctx->fd2); struct evconnlistener *evcl2 = evconnlistener_new(ctx->mctx->thr->evbase, proxy_listener_acceptcb_e2, ctx->mctx, LEV_OPT_CLOSE_ON_FREE, 1024, ctx->mctx->fd2); if (!evcl2) { @@ -3580,9 +3587,9 @@ pxy_fd_readcb(MAYBE_UNUSED evutil_socket_t fd, UNUSED short what, void *arg) } #endif /* !OPENSSL_NO_TLSEXT */ - // Child connections will use the addr info obtained by the parent connection - ctx->mctx->addrlen = ctx->addrlen; - memcpy(&ctx->mctx->addr, &ctx->addr, ctx->addrlen); +// // Child connections will use the addr info obtained by the parent connection +// ctx->mctx->addrlen = ctx->addrlen; +// memcpy(&ctx->mctx->addr, &ctx->addr, ctx->addrlen); log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>> pxy_fd_readcb() pxy_conn_connect\n"); pxy_conn_connect(ctx); diff --git a/pxythrmgr.c b/pxythrmgr.c index 0825d25..f7454fa 100644 --- a/pxythrmgr.c +++ b/pxythrmgr.c @@ -421,8 +421,8 @@ pxy_thrmgr_print_thr_info(pxy_thr_ctx_t *ctx) int count = 0; while (mctx) { char *host, *port; - if (sys_sockaddr_str((struct sockaddr *)&mctx->addr, mctx->addrlen, &host, &port) != 0) { - log_dbg_level_printf(LOG_DBG_MODE_FINE, ">>> pxy_thrmgr_print_thr_info(): sys_sockaddr_str FAILED\n"); + if (mctx->addrlen == 0 || (sys_sockaddr_str((struct sockaddr *)&mctx->addr, mctx->addrlen, &host, &port) != 0)) { + log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>> pxy_thrmgr_print_thr_info(): Cannot get host:port: thr=%d, cont=%d, fd=%d, fd2=%d\n", ctx->thridx, count, mctx->fd, mctx->fd2); log_dbg_level_printf(LOG_DBG_MODE_FINE, ">>> pxy_thrmgr_print_thr_info(): thr=%d, cont=%d, fd=%d, fd2=%d, src=%d, e2src=%d, dst=%d, e2dst=%d, dst2=%d, p=%d-%d-%d c=%d-%d, init=%d, pe=%d ce=%d tcc=%d, time=%lld\n", ctx->thridx, count, mctx->fd, mctx->fd2, mctx->src_fd, mctx->e2src_fd, mctx->dst_fd, mctx->e2dst_fd, mctx->dst2_fd, mctx->src_eof, mctx->e2src_eof, mctx->dst_eof, mctx->e2dst_eof, mctx->dst2_eof, mctx->initialized, mctx->parent_ctx ? 1:0, mctx->child_ctx ? 1:0, mctx->child_count,(long int) now - mctx->access_time);