diff options
author | Omar Polo <op@omarpolo.com> | 2021-10-15 07:46:30 +0000 |
---|---|---|
committer | Omar Polo <op@omarpolo.com> | 2021-10-15 07:46:30 +0000 |
commit | 80444938654389aa7970aaa43c4590d63da6844d (patch) | |
tree | f7b03f45a7fb7b510de1f5d5f55705f349d72042 /server.c | |
parent | 33c4c3a5ba6331d7140be52dc3a4612abc07694d (diff) |
move bufferevent initialization early in handle_handshake
the error path needs an initialized bufferevent too, otherwise it'll
crash when trying to write the response.
This moves the initialisation early, right after the tls_handshake.
Another option would be to initialise it in do_accept, but that may be
too early.
Diffstat (limited to 'server.c')
-rw-r--r-- | server.c | 34 |
1 files changed, 16 insertions, 18 deletions
@@ -468,6 +468,22 @@ handle_handshake(int fd, short ev, void *d) abort(); } + c->bev = bufferevent_new(fd, client_read, client_write, + client_error, c); + if (c->bev == NULL) + fatal("%s: failed to allocate client buffer: %s", + __func__, strerror(errno)); + + event_set(&c->bev->ev_read, c->fd, EV_READ, + client_tls_readcb, c->bev); + event_set(&c->bev->ev_write, c->fd, EV_WRITE, + client_tls_writecb, c->bev); + +#if HAVE_LIBEVENT2 + evbuffer_unfreeze(c->bev->input, 0); + evbuffer_unfreeze(c->bev->output, 1); +#endif + if ((servname = tls_conn_servername(c->ctx)) == NULL) { log_debug(c, "handshake: missing SNI"); goto err; @@ -495,25 +511,7 @@ found: if (h != NULL) { c->host = h; - - c->bev = bufferevent_new(fd, client_read, client_write, - client_error, c); - if (c->bev == NULL) - fatal("%s: failed to allocate client buffer: %s", - __func__, strerror(errno)); - - event_set(&c->bev->ev_read, c->fd, EV_READ, - client_tls_readcb, c->bev); - event_set(&c->bev->ev_write, c->fd, EV_WRITE, - client_tls_writecb, c->bev); - -#if HAVE_LIBEVENT2 - evbuffer_unfreeze(c->bev->input, 0); - evbuffer_unfreeze(c->bev->output, 1); -#endif - bufferevent_enable(c->bev, EV_READ); - return; } |