=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-save-buffer.c,v retrieving revision 1.30 retrieving revision 1.31 diff -c -r1.30 -r1.31 *** src/usr.bin/tmux/cmd-save-buffer.c 2015/08/29 09:36:46 1.30 --- src/usr.bin/tmux/cmd-save-buffer.c 2015/10/31 08:13:58 1.31 *************** *** 1,4 **** ! /* $OpenBSD: cmd-save-buffer.c,v 1.30 2015/08/29 09:36:46 nicm Exp $ */ /* * Copyright (c) 2009 Tiago Cunha --- 1,4 ---- ! /* $OpenBSD: cmd-save-buffer.c,v 1.31 2015/10/31 08:13:58 nicm Exp $ */ /* * Copyright (c) 2009 Tiago Cunha *************** *** 57,66 **** struct client *c = cmdq->client; struct session *s; struct paste_buffer *pb; ! const char *path, *bufname, *bufdata, *start, *end; ! char *msg; size_t size, used, msglen, bufsize; - int cwd, fd; FILE *f; if (!args_has(args, 'b')) { --- 57,66 ---- struct client *c = cmdq->client; struct session *s; struct paste_buffer *pb; ! const char *path, *bufname, *bufdata, *start, *end, *cwd; ! const char *flags; ! char *msg, *file, resolved[PATH_MAX]; size_t size, used, msglen, bufsize; FILE *f; if (!args_has(args, 'b')) { *************** *** 97,122 **** else if ((s = cmd_find_current(cmdq)) != NULL) cwd = s->cwd; else ! cwd = AT_FDCWD; ! f = NULL; ! if (args_has(self->args, 'a')) { ! fd = openat(cwd, path, O_CREAT|O_RDWR|O_APPEND, 0600); ! if (fd != -1) ! f = fdopen(fd, "ab"); ! } else { ! fd = openat(cwd, path, O_CREAT|O_RDWR|O_TRUNC, 0600); ! if (fd != -1) ! f = fdopen(fd, "wb"); ! } if (f == NULL) { ! if (fd != -1) ! close(fd); ! cmdq_error(cmdq, "%s: %s", path, strerror(errno)); return (CMD_RETURN_ERROR); } if (fwrite(bufdata, 1, bufsize, f) != bufsize) { ! cmdq_error(cmdq, "%s: fwrite error", path); fclose(f); return (CMD_RETURN_ERROR); } --- 97,121 ---- else if ((s = cmd_find_current(cmdq)) != NULL) cwd = s->cwd; else ! cwd = "."; ! flags = "wb"; ! if (args_has(self->args, 'a')) ! flags = "ab"; ! ! xasprintf(&file, "%s/%s", cwd, path); ! if (realpath(file, resolved) == NULL) ! f = NULL; ! else ! f = fopen(resolved, flags); ! free(file); if (f == NULL) { ! cmdq_error(cmdq, "%s: %s", resolved, strerror(errno)); return (CMD_RETURN_ERROR); } + if (fwrite(bufdata, 1, bufsize, f) != bufsize) { ! cmdq_error(cmdq, "%s: write error", resolved); fclose(f); return (CMD_RETURN_ERROR); }