=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-split-window.c,v retrieving revision 1.60 retrieving revision 1.61 diff -c -r1.60 -r1.61 *** src/usr.bin/tmux/cmd-split-window.c 2015/10/28 09:51:55 1.60 --- src/usr.bin/tmux/cmd-split-window.c 2015/10/31 08:13:58 1.61 *************** *** 1,4 **** ! /* $OpenBSD: cmd-split-window.c,v 1.60 2015/10/28 09:51:55 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-split-window.c,v 1.61 2015/10/31 08:13:58 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott *************** *** 53,62 **** struct window *w; struct window_pane *wp, *new_wp = NULL; struct environ *env; ! const char *cmd, *path, *shell, *template; char **argv, *cause, *new_cause, *cp; u_int hlimit; ! int argc, size, percentage, cwd, fd = -1; enum layout_type type; struct layout_cell *lc; struct format_tree *ft; --- 53,62 ---- struct window *w; struct window_pane *wp, *new_wp = NULL; struct environ *env; ! const char *cmd, *path, *shell, *template, *cwd, *to_free; char **argv, *cause, *new_cause, *cp; u_int hlimit; ! int argc, size, percentage; enum layout_type type; struct layout_cell *lc; struct format_tree *ft; *************** *** 86,109 **** argv = args->argv; } if (args_has(args, 'c')) { ft = format_create(); format_defaults(ft, cmd_find_client(cmdq, NULL, 1), s, NULL, NULL); ! cp = format_expand(ft, args_get(args, 'c')); format_free(ft); ! if (cp != NULL && *cp != '\0') { ! fd = open(cp, O_RDONLY|O_DIRECTORY); ! free(cp); ! if (fd == -1) { ! cmdq_error(cmdq, "bad working directory: %s", ! strerror(errno)); ! return (CMD_RETURN_ERROR); ! } ! } else ! free(cp); ! cwd = fd; } else if (cmdq->client != NULL && cmdq->client->session == NULL) cwd = cmdq->client->cwd; else --- 86,105 ---- argv = args->argv; } + to_free = NULL; if (args_has(args, 'c')) { ft = format_create(); format_defaults(ft, cmd_find_client(cmdq, NULL, 1), s, NULL, NULL); ! to_free = cwd = format_expand(ft, args_get(args, 'c')); format_free(ft); ! if (access(cwd, X_OK) != 0) { ! free((void *)cwd); ! cmdq_error(cmdq, "bad working directory: %s", ! strerror(errno)); ! return (CMD_RETURN_ERROR); ! } } else if (cmdq->client != NULL && cmdq->client->session == NULL) cwd = cmdq->client->cwd; else *************** *** 188,195 **** } notify_window_layout_changed(w); ! if (fd != -1) ! close(fd); return (CMD_RETURN_NORMAL); error: --- 184,191 ---- } notify_window_layout_changed(w); ! if (to_free != NULL) ! free((void *)to_free); return (CMD_RETURN_NORMAL); error: *************** *** 200,206 **** } cmdq_error(cmdq, "create pane failed: %s", cause); free(cause); ! if (fd != -1) ! close(fd); return (CMD_RETURN_ERROR); } --- 196,203 ---- } cmdq_error(cmdq, "create pane failed: %s", cause); free(cause); ! ! if (to_free != NULL) ! free((void *)to_free); return (CMD_RETURN_ERROR); }