diff options
author | Thomas Adam <thomas@xteddy.org> | 2015-10-31 10:01:12 +0000 |
---|---|---|
committer | Thomas Adam <thomas@xteddy.org> | 2015-10-31 10:01:12 +0000 |
commit | 17f6c3be8eeb0b67d07f916026dab918795c0317 (patch) | |
tree | 08a10a780a8de977d4452c10a7a9c03db1ae1702 /cmd-save-buffer.c | |
parent | e8bb385d6d9d8a91b5fa78e906531afc02320b80 (diff) | |
parent | 01defc9f4965bb174e1d1295754d5a8695683054 (diff) |
Merge branch 'obsd-master'
Diffstat (limited to 'cmd-save-buffer.c')
-rw-r--r-- | cmd-save-buffer.c | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/cmd-save-buffer.c b/cmd-save-buffer.c index 1e020934..6c55fabb 100644 --- a/cmd-save-buffer.c +++ b/cmd-save-buffer.c @@ -56,10 +56,10 @@ cmd_save_buffer_exec(struct cmd *self, struct cmd_q *cmdq) struct client *c = cmdq->client; struct session *s; struct paste_buffer *pb; - const char *path, *bufname, *bufdata, *start, *end; - char *msg; + const char *path, *bufname, *bufdata, *start, *end, *cwd; + const char *flags; + char *msg, *file, resolved[PATH_MAX]; size_t size, used, msglen, bufsize; - int cwd, fd; FILE *f; if (!args_has(args, 'b')) { @@ -96,26 +96,25 @@ cmd_save_buffer_exec(struct cmd *self, struct cmd_q *cmdq) else if ((s = cmd_find_current(cmdq)) != NULL) cwd = s->cwd; else - cwd = AT_FDCWD; + cwd = "."; - 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"); - } + 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) { - if (fd != -1) - close(fd); - cmdq_error(cmdq, "%s: %s", path, strerror(errno)); + cmdq_error(cmdq, "%s: %s", resolved, strerror(errno)); return (CMD_RETURN_ERROR); } + if (fwrite(bufdata, 1, bufsize, f) != bufsize) { - cmdq_error(cmdq, "%s: fwrite error", path); + cmdq_error(cmdq, "%s: write error", resolved); fclose(f); return (CMD_RETURN_ERROR); } |