Do not call recalculate_sizes while clearing a client session because it

needs to loop over the clients, instead do it after all clients are
cleared. Fixes a crash reported by martijn@ when a session with multiple
clients attached is destroyed, but there are other sessions so tmux does
not entirely exit. ok deraadt
This commit is contained in:
nicm 2021-09-27 19:12:00 +00:00
parent 257e9ba69a
commit 68c8905859

View File

@ -321,11 +321,11 @@ server_client_set_session(struct client *c, struct session *s)
c->last_session = NULL; c->last_session = NULL;
c->session = s; c->session = s;
c->flags |= CLIENT_FOCUSED; c->flags |= CLIENT_FOCUSED;
recalculate_sizes();
if (old != NULL && old->curw != NULL) if (old != NULL && old->curw != NULL)
window_update_focus(old->curw->window); window_update_focus(old->curw->window);
if (s != NULL) { if (s != NULL) {
recalculate_sizes();
window_update_focus(s->curw->window); window_update_focus(s->curw->window);
session_update_activity(s, NULL); session_update_activity(s, NULL);
gettimeofday(&s->last_attached_time, NULL); gettimeofday(&s->last_attached_time, NULL);
@ -2057,6 +2057,7 @@ server_client_dispatch(struct imsg *imsg, void *arg)
if (datalen != 0) if (datalen != 0)
fatalx("bad MSG_EXITING size"); fatalx("bad MSG_EXITING size");
server_client_set_session(c, NULL); server_client_set_session(c, NULL);
recalculate_sizes();
tty_close(&c->tty); tty_close(&c->tty);
proc_send(c->peer, MSG_EXITED, -1, NULL, 0); proc_send(c->peer, MSG_EXITED, -1, NULL, 0);
break; break;