improve proxy error path

properly release everything when during client_close if the request
was managed by a proxy.
This commit is contained in:
Omar Polo 2022-01-27 09:55:52 +00:00
parent d28bd963c2
commit e0f6dc646d
3 changed files with 16 additions and 11 deletions

1
gmid.h
View File

@ -240,6 +240,7 @@ struct client {
struct proxy *proxy;
struct bufferevent *proxybev;
struct tls *proxyctx;
int proxyevset;
struct event proxyev;
char *header;

View File

@ -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);

View File

@ -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);
}