mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	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:
		@@ -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;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user