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.
pull/3747/head
nicm 2023-11-14 15:59:49 +00:00
parent 1a14d6d2e1
commit 88fd1f00b8
2 changed files with 21 additions and 9 deletions

View File

@ -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);
}

View File

@ -472,17 +472,26 @@ void
status_message_set(struct client *c, int delay, int ignore_styles,
int ignore_keys, const char *fmt, ...)
{
struct timeval tv;
va_list ap;
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