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_value		*value;
 | 
				
			||||||
	struct args_command_state	*state;
 | 
						struct args_command_state	*state;
 | 
				
			||||||
	const char			*cmd;
 | 
						const char			*cmd;
 | 
				
			||||||
 | 
						const char			*file;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	state = xcalloc(1, sizeof *state);
 | 
						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)
 | 
						if (wait)
 | 
				
			||||||
		state->pi.item = item;
 | 
							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;
 | 
						state->pi.c = tc;
 | 
				
			||||||
	if (state->pi.c != NULL)
 | 
						if (state->pi.c != NULL)
 | 
				
			||||||
		state->pi.c->references++;
 | 
							state->pi.c->references++;
 | 
				
			||||||
@@ -842,6 +844,7 @@ args_make_commands_free(struct args_command_state *state)
 | 
				
			|||||||
		cmd_list_free(state->cmdlist);
 | 
							cmd_list_free(state->cmdlist);
 | 
				
			||||||
	if (state->pi.c != NULL)
 | 
						if (state->pi.c != NULL)
 | 
				
			||||||
		server_client_unref(state->pi.c);
 | 
							server_client_unref(state->pi.c);
 | 
				
			||||||
 | 
						free((void *)state->pi.file);
 | 
				
			||||||
	free(state->cmd);
 | 
						free(state->cmd);
 | 
				
			||||||
	free(state);
 | 
						free(state);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										25
									
								
								status.c
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								status.c
									
									
									
									
									
								
							@@ -472,17 +472,26 @@ void
 | 
				
			|||||||
status_message_set(struct client *c, int delay, int ignore_styles,
 | 
					status_message_set(struct client *c, int delay, int ignore_styles,
 | 
				
			||||||
    int ignore_keys, const char *fmt, ...)
 | 
					    int ignore_keys, const char *fmt, ...)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct timeval	tv;
 | 
						struct timeval	 tv;
 | 
				
			||||||
	va_list		ap;
 | 
						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_message_clear(c);
 | 
				
			||||||
	status_push_screen(c);
 | 
						status_push_screen(c);
 | 
				
			||||||
 | 
						c->message_string = s;
 | 
				
			||||||
	va_start(ap, fmt);
 | 
						server_add_message("%s message: %s", c->name, s);
 | 
				
			||||||
	xvasprintf(&c->message_string, fmt, ap);
 | 
					 | 
				
			||||||
	va_end(ap);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	server_add_message("%s message: %s", c->name, c->message_string);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * With delay -1, the display-time option is used; zero means wait for
 | 
						 * With delay -1, the display-time option is used; zero means wait for
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user