diff options
author | Dave Reisner <dreisner@archlinux.org> | 2011-10-17 15:47:06 +0200 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2011-10-28 00:46:48 +0200 |
commit | f4875fab9bbe3011446032bebcbe232448a3e8d7 (patch) | |
tree | 937dc8ff21f3927f635c38d0fd4cd70d5cb7e229 | |
parent | 3343185473c79d556b29bda30c9c482c7fef5289 (diff) | |
download | pacman-f4875fab9bbe3011446032bebcbe232448a3e8d7.tar.gz pacman-f4875fab9bbe3011446032bebcbe232448a3e8d7.tar.xz |
dload: chmod tempfiles to respect umask
Dan: fix mask calculation, add it to the success/fail block instead.
Signed-off-by: Dave Reisner <dreisner@archlinux.org>
Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r-- | lib/libalpm/dload.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index 9d919b0a..546329b3 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -178,6 +178,14 @@ static int utimes_long(const char *path, long seconds) return 0; } +/* prefix to avoid possible future clash with getumask(3) */ +static mode_t _getumask(void) +{ + mode_t mask = umask(0); + umask(mask); + return mask; +} + static size_t parse_headers(void *ptr, size_t size, size_t nmemb, void *user) { size_t realsize = size * nmemb; @@ -295,9 +303,12 @@ static FILE *create_tempfile(struct dload_payload *payload, const char *localpat MALLOC(randpath, len, RET_ERR(payload->handle, ALPM_ERR_MEMORY, NULL)); snprintf(randpath, len, "%salpmtmp.XXXXXX", localpath); if((fd = mkstemp(randpath)) == -1 || + fchmod(fd, ~(_getumask()) & 0666) || !(fp = fdopen(fd, payload->tempfile_openmode))) { unlink(randpath); - close(fd); + if(fd >= 0) { + close(fd); + } _alpm_log(payload->handle, ALPM_LOG_ERROR, _("failed to create temporary file for download\n")); return NULL; |