diff --git a/cmd-join-pane.c b/cmd-join-pane.c index 6b6421fa..2fa2561f 100644 --- a/cmd-join-pane.c +++ b/cmd-join-pane.c @@ -118,7 +118,7 @@ cmd_join_pane_exec(struct cmd *self, struct cmdq_item *item) size = args_percentage_and_expand(args, 'l', 0, INT_MAX, curval, item, &cause); } else if (args_has(args, 'p')) { - size = args_strtonum_and_expand(args, 'l', 0, 100, item, + size = args_strtonum_and_expand(args, 'p', 0, 100, item, &cause); if (cause == NULL) size = curval * size / 100; diff --git a/cmd-pipe-pane.c b/cmd-pipe-pane.c index a2f8df1b..844b8b85 100644 --- a/cmd-pipe-pane.c +++ b/cmd-pipe-pane.c @@ -128,6 +128,8 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmdq_item *item) sigprocmask(SIG_SETMASK, &oldset, NULL); cmdq_error(item, "fork error: %s", strerror(errno)); + close(pipe_fd[0]); + close(pipe_fd[1]); free(cmd); return (CMD_RETURN_ERROR); case 0: diff --git a/cmd-run-shell.c b/cmd-run-shell.c index 045f551e..a9f1c1fe 100644 --- a/cmd-run-shell.c +++ b/cmd-run-shell.c @@ -198,8 +198,17 @@ cmd_run_shell_timer(__unused int fd, __unused short events, void* arg) } if (job_run(cmd, 0, NULL, NULL, cdata->s, cdata->cwd, NULL, cmd_run_shell_callback, cmd_run_shell_free, cdata, - cdata->flags, -1, -1) == NULL) + cdata->flags, -1, -1) == NULL) { + if (cdata->item == NULL) + status_message_set(c, -1, 1, 0, 0, + "failed to run command: %s", cmd); + else { + cmdq_error(cdata->item, + "failed to run command: %s", cmd); + cmdq_continue(cdata->item); + } cmd_run_shell_free(cdata); + } return; } diff --git a/paste.c b/paste.c index 7eda6ada..6461d9ba 100644 --- a/paste.c +++ b/paste.c @@ -204,6 +204,7 @@ int paste_rename(const char *oldname, const char *newname, char **cause) { struct paste_buffer *pb, *pb_new; + char *name; if (cause != NULL) *cause = NULL; @@ -219,23 +220,33 @@ paste_rename(const char *oldname, const char *newname, char **cause) return (-1); } + name = clean_name(newname, ""); + if (name == NULL) { + if (cause != NULL) + xasprintf(cause, "invalid buffer name: %s", newname); + return (-1); + } + pb = paste_get_name(oldname); if (pb == NULL) { if (cause != NULL) xasprintf(cause, "no buffer %s", oldname); + free(name); return (-1); } - pb_new = paste_get_name(newname); - if (pb_new == pb) + pb_new = paste_get_name(name); + if (pb_new == pb) { + free(name); return (0); + } if (pb_new != NULL) paste_free(pb_new); RB_REMOVE(paste_name_tree, &paste_by_name, pb); free(pb->name); - pb->name = xstrdup(newname); + pb->name = name; if (pb->automatic) paste_num_automatic--; @@ -244,7 +255,7 @@ paste_rename(const char *oldname, const char *newname, char **cause) RB_INSERT(paste_name_tree, &paste_by_name, pb); notify_paste_buffer(oldname, 1); - notify_paste_buffer(newname, 0); + notify_paste_buffer(pb->name, 0); return (0); } @@ -257,6 +268,7 @@ int paste_set(char *data, size_t size, const char *name, char **cause) { struct paste_buffer *pb, *old; + char *newname; if (cause != NULL) *cause = NULL; @@ -276,9 +288,16 @@ paste_set(char *data, size_t size, const char *name, char **cause) return (-1); } + newname = clean_name(name, ""); + if (newname == NULL) { + if (cause != NULL) + xasprintf(cause, "invalid buffer name: %s", name); + return (-1); + } + pb = xmalloc(sizeof *pb); - pb->name = xstrdup(name); + pb->name = newname; pb->data = data; pb->size = size; @@ -288,13 +307,13 @@ paste_set(char *data, size_t size, const char *name, char **cause) pb->created = time(NULL); - if ((old = paste_get_name(name)) != NULL) + if ((old = paste_get_name(pb->name)) != NULL) paste_free(old); RB_INSERT(paste_name_tree, &paste_by_name, pb); RB_INSERT(paste_time_tree, &paste_by_time, pb); - notify_paste_buffer(name, 0); + notify_paste_buffer(pb->name, 0); return (0); } diff --git a/window-copy.c b/window-copy.c index ac89dc56..0b6bf69a 100644 --- a/window-copy.c +++ b/window-copy.c @@ -5171,7 +5171,8 @@ window_copy_pipe_run(struct window_mode_entry *wme, struct session *s, if (cmd != NULL && *cmd != '\0') { job = job_run(cmd, 0, NULL, NULL, s, NULL, NULL, NULL, NULL, NULL, JOB_NOWAIT, -1, -1); - bufferevent_write(job_get_event(job), buf, *len); + if (job != NULL) + bufferevent_write(job_get_event(job), buf, *len); } return (buf); }