diff options
author | Omar Polo <op@omarpolo.com> | 2022-01-27 09:55:52 +0000 |
---|---|---|
committer | Omar Polo <op@omarpolo.com> | 2022-01-27 09:55:52 +0000 |
commit | e0f6dc646d6c257869c17f16db977cd064262830 (patch) | |
tree | 73a5052ca9af25d4416b13f1ced4a754ed958e63 | |
parent | d28bd963c2450790bdb6bf2193af5670581c0c24 (diff) |
improve proxy error path
properly release everything when during client_close if the request
was managed by a proxy.
-rw-r--r-- | gmid.h | 1 | ||||
-rw-r--r-- | proxy.c | 2 | ||||
-rw-r--r-- | server.c | 22 |
3 files changed, 15 insertions, 10 deletions
@@ -240,6 +240,7 @@ struct client { struct proxy *proxy; struct bufferevent *proxybev; struct tls *proxyctx; + int proxyevset; struct event proxyev; char *header; @@ -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); @@ -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; - } + if (c->proxyevset && + event_pending(&c->proxyev, EV_READ|EV_WRITE, NULL)) { + c->proxyevset = 0; + event_del(&c->proxyev); + } - bufferevent_free(c->proxybev); + 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); } |