mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Handle NULL client (in config file) when showing a status message; also
copy the file when processing if-shell since it may be freed. GitHub issue 3746.
This commit is contained in:
		@@ -761,6 +761,7 @@ args_make_commands_prepare(struct cmd *self, struct cmdq_item *item, u_int idx,
 | 
			
		||||
	struct args_value		*value;
 | 
			
		||||
	struct args_command_state	*state;
 | 
			
		||||
	const char			*cmd;
 | 
			
		||||
	const char			*file;
 | 
			
		||||
 | 
			
		||||
	state = xcalloc(1, sizeof *state);
 | 
			
		||||
 | 
			
		||||
@@ -787,7 +788,8 @@ args_make_commands_prepare(struct cmd *self, struct cmdq_item *item, u_int idx,
 | 
			
		||||
 | 
			
		||||
	if (wait)
 | 
			
		||||
		state->pi.item = item;
 | 
			
		||||
	cmd_get_source(self, &state->pi.file, &state->pi.line);
 | 
			
		||||
	cmd_get_source(self, &file, &state->pi.line);
 | 
			
		||||
	state->pi.file = xstrdup(file);
 | 
			
		||||
	state->pi.c = tc;
 | 
			
		||||
	if (state->pi.c != NULL)
 | 
			
		||||
		state->pi.c->references++;
 | 
			
		||||
@@ -842,6 +844,7 @@ args_make_commands_free(struct args_command_state *state)
 | 
			
		||||
		cmd_list_free(state->cmdlist);
 | 
			
		||||
	if (state->pi.c != NULL)
 | 
			
		||||
		server_client_unref(state->pi.c);
 | 
			
		||||
	free((void *)state->pi.file);
 | 
			
		||||
	free(state->cmd);
 | 
			
		||||
	free(state);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								status.c
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								status.c
									
									
									
									
									
								
							@@ -474,15 +474,24 @@ status_message_set(struct client *c, int delay, int ignore_styles,
 | 
			
		||||
{
 | 
			
		||||
	struct timeval	 tv;
 | 
			
		||||
	va_list		 ap;
 | 
			
		||||
	char		*s;
 | 
			
		||||
 | 
			
		||||
	va_start(ap, fmt);
 | 
			
		||||
	xvasprintf(&s, fmt, ap);
 | 
			
		||||
	va_end(ap);
 | 
			
		||||
 | 
			
		||||
	log_debug("%s: %s", __func__, s);
 | 
			
		||||
 | 
			
		||||
	if (c == NULL) {
 | 
			
		||||
		server_add_message("message: %s", s);
 | 
			
		||||
		free(s);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	status_message_clear(c);
 | 
			
		||||
	status_push_screen(c);
 | 
			
		||||
 | 
			
		||||
	va_start(ap, fmt);
 | 
			
		||||
	xvasprintf(&c->message_string, fmt, ap);
 | 
			
		||||
	va_end(ap);
 | 
			
		||||
 | 
			
		||||
	server_add_message("%s message: %s", c->name, c->message_string);
 | 
			
		||||
	c->message_string = s;
 | 
			
		||||
	server_add_message("%s message: %s", c->name, s);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * With delay -1, the display-time option is used; zero means wait for
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user