Remove stale signature files and fail if moving a required signature file fails.

This commit is contained in:
Patrick Northon 2024-05-11 11:05:22 -04:00
parent 8aba032de4
commit dcad869c6e

View file

@ -1094,6 +1094,25 @@ static int move_file(const char *filepath, const char *directory)
return 0; return 0;
} }
static int unlink_and_maybe_move_file(const char *filepath, const char *directory, const bool do_move)
{
ASSERT(filepath != NULL, return -1);
ASSERT(directory != NULL, return -1);
int ret = finalize_download_file(filepath);
if(ret != 0) {
return ret;
}
const char *filename = mbasename(filepath);
char *dest = _alpm_get_fullpath(directory, filename, "");
unlink(dest);
if(do_move && rename(filepath, dest)) {
FREE(dest);
return -1;
}
FREE(dest);
return 0;
}
static int finalize_download_locations(alpm_list_t *payloads, const char *localpath) static int finalize_download_locations(alpm_list_t *payloads, const char *localpath)
{ {
ASSERT(payloads != NULL, return -1); ASSERT(payloads != NULL, return -1);
@ -1108,18 +1127,20 @@ static int finalize_download_locations(alpm_list_t *payloads, const char *localp
if(payload->destfile_name) { if(payload->destfile_name) {
int ret = move_file(payload->destfile_name, localpath); int ret = move_file(payload->destfile_name, localpath);
if(ret == -1) { const char sig_suffix[] = ".sig";
returnvalue = -1; char *sig_filename = NULL;
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);
if(unlink_and_maybe_move_file(sig_filename, localpath, payload->download_signature) == -1 && !payload->signature_optional) {
ret = -1;
} }
if (payload->download_signature) { FREE(sig_filename);
const char sig_suffix[] = ".sig";
char *sig_filename = NULL; if(ret == -1) {
size_t sig_filename_len = strlen(payload->destfile_name) + sizeof(sig_suffix); returnvalue = -1;
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);
FREE(sig_filename);
} }
} }
} }