diff --git a/cmd-if-shell.c b/cmd-if-shell.c index 7d3e8e12..3dc20cd1 100644 --- a/cmd-if-shell.c +++ b/cmd-if-shell.c @@ -50,6 +50,9 @@ const struct cmd_entry cmd_if_shell_entry = { }; struct cmd_if_shell_data { + char *file; + u_int line; + char *cmd_if; char *cmd_else; @@ -106,7 +109,11 @@ cmd_if_shell_exec(struct cmd *self, struct cmd_q *cmdq) return (CMD_RETURN_NORMAL); } - cdata = xmalloc(sizeof *cdata); + cdata = xcalloc(1, sizeof *cdata); + if (self->file != NULL) { + cdata->file = xstrdup(self->file); + cdata->line = self->line; + } cdata->cmd_if = xstrdup(args->argv[1]); if (args->argc == 3) @@ -148,7 +155,8 @@ cmd_if_shell_callback(struct job *job) if (cmd == NULL) return; - if (cmd_string_parse(cmd, &cmdlist, NULL, 0, &cause) != 0) { + if (cmd_string_parse(cmd, &cmdlist, cdata->file, cdata->line, + &cause) != 0) { if (cause != NULL) { cmdq_error(cmdq, "%s", cause); free(cause); @@ -184,6 +192,8 @@ cmd_if_shell_done(struct cmd_q *cmdq1) free(cdata->cmd_else); free(cdata->cmd_if); + + free(cdata->file); free(cdata); } @@ -201,5 +211,7 @@ cmd_if_shell_free(void *data) free(cdata->cmd_else); free(cdata->cmd_if); + + free(cdata->file); free(cdata); } diff --git a/cmd-run-shell.c b/cmd-run-shell.c index 0bd8fc59..d87a061f 100644 --- a/cmd-run-shell.c +++ b/cmd-run-shell.c @@ -97,7 +97,7 @@ cmd_run_shell_exec(struct cmd *self, struct cmd_q *cmdq) shellcmd = format_expand(ft, args->argv[0]); format_free(ft); - cdata = xmalloc(sizeof *cdata); + cdata = xcalloc(1, sizeof *cdata); cdata->cmd = shellcmd; cdata->bflag = args_has(args, 'b'); cdata->wp_id = wp != NULL ? (int) wp->id : -1; diff --git a/cmd-set-option.c b/cmd-set-option.c index 491353a8..0f116b6f 100644 --- a/cmd-set-option.c +++ b/cmd-set-option.c @@ -232,6 +232,7 @@ cmd_set_option_user(struct cmd *self, struct cmd_q *cmdq, const char *optstr, struct winlink *wl = cmdq->state.tflag.wl; struct options *oo; struct options_entry *o; + const char *target; if (args_has(args, 's')) oo = global_options; @@ -239,12 +240,28 @@ cmd_set_option_user(struct cmd *self, struct cmd_q *cmdq, const char *optstr, self->entry == &cmd_set_window_option_entry) { if (args_has(self->args, 'g')) oo = global_w_options; - else + else if (wl == NULL) { + target = args_get(args, 't'); + if (target != NULL) { + cmdq_error(cmdq, "no such window: %s", + target); + } else + cmdq_error(cmdq, "no current window"); + return (CMD_RETURN_ERROR); + } else oo = wl->window->options; } else { if (args_has(self->args, 'g')) oo = global_s_options; - else + else if (s == NULL) { + target = args_get(args, 't'); + if (target != NULL) { + cmdq_error(cmdq, "no such session: %s", + target); + } else + cmdq_error(cmdq, "no current session"); + return (CMD_RETURN_ERROR); + } else oo = s->options; } diff --git a/window-copy.c b/window-copy.c index 4c95ba66..f1379604 100644 --- a/window-copy.c +++ b/window-copy.c @@ -1288,7 +1288,8 @@ window_copy_write_line(struct window_pane *wp, struct screen_write_ctx *ctx, xoff = size = xsnprintf(hdr, limit, "Repeat: %d", data->numprefix); } else { - xoff = size = xsnprintf(hdr, limit, + /* We don't care about truncation. */ + xoff = size = snprintf(hdr, limit, "%s: %s", data->inputprompt, data->inputstr); } screen_write_cursormove(ctx, 0, last);