author | Rys Sommefeldt <rys@pixeltards.com> | 2009-11-07 14:24:45 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2009-11-07 14:34:18 (UTC) |
commit | 8cfe4897f01066ae901bdd6ef106faf8e8f2ddf2 (patch) (side-by-side diff) | |
tree | 2b66d688de6ce2b7598cc78ea6ed812f2d5f882a | |
parent | e34a3b5adc00255f8acb7d674e5fdadef2ac80f7 (diff) | |
download | cgit-8cfe4897f01066ae901bdd6ef106faf8e8f2ddf2.zip cgit-8cfe4897f01066ae901bdd6ef106faf8e8f2ddf2.tar.gz cgit-8cfe4897f01066ae901bdd6ef106faf8e8f2ddf2.tar.bz2 |
Close fd on error in readfile()
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-rw-r--r-- | shared.c | 9 |
1 files changed, 7 insertions, 2 deletions
@@ -361,57 +361,62 @@ int cgit_parse_snapshots_mask(const char *str) } int cgit_open_filter(struct cgit_filter *filter) { filter->old_stdout = chk_positive(dup(STDOUT_FILENO), "Unable to duplicate STDOUT"); chk_zero(pipe(filter->pipe_fh), "Unable to create pipe to subprocess"); filter->pid = chk_non_negative(fork(), "Unable to create subprocess"); if (filter->pid == 0) { close(filter->pipe_fh[1]); chk_non_negative(dup2(filter->pipe_fh[0], STDIN_FILENO), "Unable to use pipe as STDIN"); execvp(filter->cmd, filter->argv); die("Unable to exec subprocess %s: %s (%d)", filter->cmd, strerror(errno), errno); } close(filter->pipe_fh[0]); chk_non_negative(dup2(filter->pipe_fh[1], STDOUT_FILENO), "Unable to use pipe as STDOUT"); close(filter->pipe_fh[1]); return 0; } int cgit_close_filter(struct cgit_filter *filter) { chk_non_negative(dup2(filter->old_stdout, STDOUT_FILENO), "Unable to restore STDOUT"); close(filter->old_stdout); if (filter->pid < 0) return 0; waitpid(filter->pid, &filter->exitstatus, 0); if (WIFEXITED(filter->exitstatus) && !WEXITSTATUS(filter->exitstatus)) return 0; die("Subprocess %s exited abnormally", filter->cmd); } /* Read the content of the specified file into a newly allocated buffer, * zeroterminate the buffer and return 0 on success, errno otherwise. */ int readfile(const char *path, char **buf, size_t *size) { int fd; struct stat st; fd = open(path, O_RDONLY); if (fd == -1) return errno; - if (fstat(fd, &st)) + if (fstat(fd, &st)) { + close(fd); return errno; - if (!S_ISREG(st.st_mode)) + } + if (!S_ISREG(st.st_mode)) { + close(fd); return EISDIR; + } *buf = xmalloc(st.st_size + 1); *size = read_in_full(fd, *buf, st.st_size); (*buf)[*size] = '\0'; + close(fd); return (*size == st.st_size ? 0 : errno); } |