aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOmar Polo <op@omarpolo.com>2022-01-27 09:55:52 +0000
committerOmar Polo <op@omarpolo.com>2022-01-27 09:55:52 +0000
commite0f6dc646d6c257869c17f16db977cd064262830 (patch)
tree73a5052ca9af25d4416b13f1ced4a754ed958e63
parentd28bd963c2450790bdb6bf2193af5670581c0c24 (diff)
improve proxy error path
properly release everything when during client_close if the request was managed by a proxy.
-rw-r--r--gmid.h1
-rw-r--r--proxy.c2
-rw-r--r--server.c22
3 files changed, 15 insertions, 10 deletions
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;
- }
+ 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);
}