diff --git a/gmid.h b/gmid.h index 9e8415d..1dde21a 100644 --- a/gmid.h +++ b/gmid.h @@ -240,6 +240,7 @@ struct client { struct proxy *proxy; struct bufferevent *proxybev; struct tls *proxyctx; + int proxyevset; struct event proxyev; char *header; diff --git a/proxy.c b/proxy.c index fa31674..97d3257 100644 --- a/proxy.c +++ b/proxy.c @@ -288,6 +288,7 @@ proxy_handshake(int fd, short event, void *d) return; } + c->proxyevset = 0; proxy_enqueue_req(c); } @@ -327,6 +328,7 @@ proxy_setup_tls(struct client *c) if (tls_connect_socket(c->proxyctx, c->pfd, p->host) == -1) goto err; + c->proxyevset = 1; event_set(&c->proxyev, c->pfd, EV_READ|EV_WRITE, proxy_handshake, c); event_add(&c->proxyev, &handshake_timeout); diff --git a/server.c b/server.c index e9211d3..c9cb7ce 100644 --- a/server.c +++ b/server.c @@ -1277,19 +1277,21 @@ client_close(struct client *c) bufferevent_free(c->bev); c->bev = NULL; - if (c->proxybev != NULL) { - if (event_pending(&c->proxyev, EV_READ|EV_WRITE, NULL)) - event_del(&c->proxyev); - - if (c->pfd != -1 && c->proxyctx != NULL) { - /* shut down the proxy TLS connection */ - client_proxy_close(c->pfd, 0, c->proxyctx); - c->pfd = -1; - } - - bufferevent_free(c->proxybev); + if (c->proxyevset && + event_pending(&c->proxyev, EV_READ|EV_WRITE, NULL)) { + c->proxyevset = 0; + event_del(&c->proxyev); } + if (c->pfd != -1 && c->proxyctx != NULL) { + /* shut down the proxy TLS connection */ + client_proxy_close(c->pfd, 0, c->proxyctx); + c->pfd = -1; + } + + if (c->proxybev != NULL) + bufferevent_free(c->proxybev); + client_close_ev(c->fd, 0, c); }