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.
This commit is contained in:
morganamilo 2024-08-27 23:21:20 +01:00
parent d1b66cf4be
commit 14b9ae7657
No known key found for this signature in database
GPG key ID: E48D0A8326DE47C5

View file

@ -73,7 +73,7 @@ static mode_t _getumask(void)
return mask; return mask;
} }
static int finalize_download_file(const char *filename) static int finalize_download_file(const char *sandboxuser, const char *filename)
{ {
struct stat st; struct stat st;
ASSERT(filename != NULL, return -1); ASSERT(filename != NULL, return -1);
@ -82,7 +82,9 @@ static int finalize_download_file(const char *filename)
unlink(filename); unlink(filename);
return 1; return 1;
} }
if(sandboxuser) {
ASSERT(chown(filename, 0, 0) != -1, return -1); ASSERT(chown(filename, 0, 0) != -1, return -1);
}
ASSERT(chmod(filename, ~(_getumask()) & 0666) != -1, return -1); ASSERT(chmod(filename, ~(_getumask()) & 0666) != -1, return -1);
return 0; return 0;
} }
@ -1079,11 +1081,11 @@ static int payload_download_fetchcb(struct dload_payload *payload,
return ret; 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(filepath != NULL, return -1);
ASSERT(directory != NULL, return -1); ASSERT(directory != NULL, return -1);
int ret = finalize_download_file(filepath); int ret = finalize_download_file(sandboxuser, filepath);
if(ret != 0) { if(ret != 0) {
return ret; return ret;
} }
@ -1105,16 +1107,17 @@ static int finalize_download_locations(alpm_list_t *payloads, const char *localp
int returnvalue = 0; int returnvalue = 0;
for(p = payloads; p; p = p->next) { for(p = payloads; p; p = p->next) {
struct dload_payload *payload = p->data; struct dload_payload *payload = p->data;
alpm_handle_t *handle = payload->handle;
if(payload->tempfile_name) { if(payload->tempfile_name) {
move_file(payload->tempfile_name, localpath); move_file(handle->sandboxuser, payload->tempfile_name, localpath);
} }
if(payload->destfile_name) { 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) { if(ret == -1) {
/* ignore error if the file already existed - only signature file was downloaded */ /* ignore error if the file already existed - only signature file was downloaded */
if(payload->mtime_existing_file == 0) { 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)); payload->destfile_name, localpath, strerror(errno));
returnvalue = -1; 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); size_t sig_filename_len = strlen(payload->destfile_name) + sizeof(sig_suffix);
MALLOC(sig_filename, sig_filename_len, continue); MALLOC(sig_filename, sig_filename_len, continue);
snprintf(sig_filename, sig_filename_len, "%s%s", payload->destfile_name, sig_suffix); 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); FREE(sig_filename);
} }
} }