From 14b9ae7657508fd3969bcf22936d229ac785b551 Mon Sep 17 00:00:00 2001 From: morganamilo Date: Tue, 27 Aug 2024 23:21:20 +0100 Subject: [PATCH] don't chown downloads if no download user Always chowning the files to root causes non root alpm based tools to be unable to download files. --- lib/libalpm/dload.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index abb7eed6..b5cf0ae3 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -73,7 +73,7 @@ static mode_t _getumask(void) return mask; } -static int finalize_download_file(const char *filename) +static int finalize_download_file(const char *sandboxuser, const char *filename) { struct stat st; ASSERT(filename != NULL, return -1); @@ -82,7 +82,9 @@ static int finalize_download_file(const char *filename) unlink(filename); return 1; } - ASSERT(chown(filename, 0, 0) != -1, return -1); + if(sandboxuser) { + ASSERT(chown(filename, 0, 0) != -1, return -1); + } ASSERT(chmod(filename, ~(_getumask()) & 0666) != -1, return -1); return 0; } @@ -1079,11 +1081,11 @@ static int payload_download_fetchcb(struct dload_payload *payload, return ret; } -static int move_file(const char *filepath, const char *directory) +static int move_file(const char* sandboxuser, const char *filepath, const char *directory) { ASSERT(filepath != NULL, return -1); ASSERT(directory != NULL, return -1); - int ret = finalize_download_file(filepath); + int ret = finalize_download_file(sandboxuser, filepath); if(ret != 0) { return ret; } @@ -1105,16 +1107,17 @@ static int finalize_download_locations(alpm_list_t *payloads, const char *localp int returnvalue = 0; for(p = payloads; p; p = p->next) { struct dload_payload *payload = p->data; + alpm_handle_t *handle = payload->handle; if(payload->tempfile_name) { - move_file(payload->tempfile_name, localpath); + move_file(handle->sandboxuser, payload->tempfile_name, localpath); } if(payload->destfile_name) { - int ret = move_file(payload->destfile_name, localpath); + int ret = move_file(handle->sandboxuser, payload->destfile_name, localpath); if(ret == -1) { /* ignore error if the file already existed - only signature file was downloaded */ if(payload->mtime_existing_file == 0) { - _alpm_log(payload->handle, ALPM_LOG_ERROR, _("could not move %s into %s (%s)\n"), + _alpm_log(handle, ALPM_LOG_ERROR, _("could not move %s into %s (%s)\n"), payload->destfile_name, localpath, strerror(errno)); returnvalue = -1; } @@ -1126,7 +1129,7 @@ static int finalize_download_locations(alpm_list_t *payloads, const char *localp size_t sig_filename_len = strlen(payload->destfile_name) + sizeof(sig_suffix); MALLOC(sig_filename, sig_filename_len, continue); snprintf(sig_filename, sig_filename_len, "%s%s", payload->destfile_name, sig_suffix); - move_file(sig_filename, localpath); + move_file(handle->sandboxuser, sig_filename, localpath); FREE(sig_filename); } }