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 proxy *proxy;
struct bufferevent *proxybev; struct bufferevent *proxybev;
struct tls *proxyctx; struct tls *proxyctx;
int proxyevset;
struct event proxyev; struct event proxyev;
char *header; char *header;

View File

@ -288,6 +288,7 @@ proxy_handshake(int fd, short event, void *d)
return; return;
} }
c->proxyevset = 0;
proxy_enqueue_req(c); 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) if (tls_connect_socket(c->proxyctx, c->pfd, p->host) == -1)
goto err; goto err;
c->proxyevset = 1;
event_set(&c->proxyev, c->pfd, EV_READ|EV_WRITE, proxy_handshake, c); event_set(&c->proxyev, c->pfd, EV_READ|EV_WRITE, proxy_handshake, c);
event_add(&c->proxyev, &handshake_timeout); event_add(&c->proxyev, &handshake_timeout);

View File

@ -1277,19 +1277,21 @@ client_close(struct client *c)
bufferevent_free(c->bev); bufferevent_free(c->bev);
c->bev = NULL; c->bev = NULL;
if (c->proxybev != NULL) { if (c->proxyevset &&
if (event_pending(&c->proxyev, EV_READ|EV_WRITE, NULL)) event_pending(&c->proxyev, EV_READ|EV_WRITE, NULL)) {
event_del(&c->proxyev); 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;
}
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); client_close_ev(c->fd, 0, c);
} }