diff --git a/tmate-daemon-decoder.c b/tmate-daemon-decoder.c index 3b2a63d3..c984b710 100644 --- a/tmate-daemon-decoder.c +++ b/tmate-daemon-decoder.c @@ -404,6 +404,7 @@ static void tmate_write_copy_mode(__unused struct tmate_session *session, static void tmate_fin(__unused struct tmate_session *session, __unused struct tmate_unpacker *uk) { + session->fin_received = true; request_server_termination(); } diff --git a/tmate-websocket.c b/tmate-websocket.c index 259d3025..26d61fbf 100644 --- a/tmate-websocket.c +++ b/tmate-websocket.c @@ -342,8 +342,16 @@ static void on_websocket_encoder_write(void *userdata, struct evbuffer *buffer) static void on_websocket_event_default(__unused struct tmate_session *session, short events) { - if (events & BEV_EVENT_EOF) + if (events & BEV_EVENT_EOF) { + if (session->fin_received) { + /* + * This is expected. The websocket will close the + * connection upon receiving the fin message. + */ + exit(0); + } tmate_fatal("Connection to websocket server closed"); + } if (events & BEV_EVENT_ERROR) tmate_fatal("Connection to websocket server error: %s", diff --git a/tmate.h b/tmate.h index 6284b0c8..6e1b9761 100644 --- a/tmate.h +++ b/tmate.h @@ -246,6 +246,7 @@ struct tmate_session { const char *client_version; int client_protocol_version; struct event ev_notify_timer; + bool fin_received; int websocket_fd; struct bufferevent *bev_websocket;