[pacman-dev] [PATCH v2] libalpm: download sig files with -U when missing

Morgan Adamiec morganamilo at archlinux.org
Tue Jan 12 11:53:44 UTC 2021



On 11/01/2021 23:38, Anatol Pomozov wrote:
> Hi
> 
> On Mon, Jan 11, 2021 at 4:27 AM morganamilo <morganamilo at archlinux.org> wrote:
>>
>> When downloading a package with -U, alpm only checks if the package
>> itself is in cache when deciding whether anything needs to be
>> downloaded. So if for some reason the package is in cache but the
>> signature file is not, there's be no attempt to download the signature
>> and instead just throw an error.
>>
>> morganamilo at Octavia ~git/pacman % rm /var/cache/pacman/pkg/*.sig
>> morganamilo at Octavia ~git/pacman % sudo ./build/pacman -U https://mirrors.ims.nksc.lt/archlinux/extra/os/x86_64/xterm-363-1-x86_64.pkg.tar.zst
>> loading packages...
>> error: '/var/cache/pacman/pkg/xterm-363-1-x86_64.pkg.tar.zst': package missing required signature
>>
>> So let's just make sure to check that the package and sig file is there
>> before downloading. Like how the -S codepath already does.
> 
> Thanks for fixing the issue. The commit looks good to me. A few questions below.
> 
>> Also, I think the way signature downloading is a bit weird. You can't
>> just download a signature. You have to say you want to download the
>> package then the downloader will download the sig after the package
>> finishes downloading.
> 
> Is this question resolved so it can be removed from the commit message?

It's still something I want to tackle. It's also not part of the commit
message, just a comment. Everything after --- won't actually make it
into the commit.

>> I think it would make more sense for signatures to be their own
>> payloads and then have a dlsigcb.
>>
>> This would go towards fixing FS#67813
> 
> Could you please add a reference to FS#33992?
> 

Ah didn't know there was a bug about it.

If I may be lazy and just ask Allan to add it to the commit message.

>>
>> If totaldlcb reports 0 packages to download, then we can show the
>> progress bars for the sigs instead of the packages.
>> ---
>>  lib/libalpm/dload.c | 21 ++++++++++++++++++++-
>>  1 file changed, 20 insertions(+), 1 deletion(-)
>>
>> diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
>> index df5e8be7..66ebeae9 100644
>> --- a/lib/libalpm/dload.c
>> +++ b/lib/libalpm/dload.c
>> @@ -863,8 +863,27 @@ int SYMEXPORT alpm_fetch_pkgurl(alpm_handle_t *handle, const alpm_list_t *urls,
>>                 char *url = i->data;
>>
>>                 /* attempt to find the file in our pkgcache */
>> +
>>                 char *filepath = filecache_find_url(handle, url);
>> -               if(filepath) {
>> +               int need_download = !filepath;
>> +               /* even if the package file in the cache we need to check for
>> +                * accompanion *.sig file as well.
>> +                * If *.sig is not cached then force download the package + its signature file.
>> +                */
>> +               if(!need_download && (handle->siglevel & ALPM_SIG_PACKAGE)) {
>> +                       char *sig_filename = NULL;
>> +                       int len = strlen(filepath) + 5;
>> +
>> +                       MALLOC(sig_filename, len, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
>> +                       snprintf(sig_filename, len, "%s.sig", filepath);
>> +
>> +                       need_download = !_alpm_filecache_exists(handle, sig_filename);
>> +
>> +                       FREE(sig_filename);
>> +               }
>> +
>> +
>> +               if(!need_download) {
>>                         /* the file is locally cached so add it to the output right away */
>>                         alpm_list_append(fetched, filepath);
>>                 } else {
> 
> Is there a chance of a memory leak for 'filepath' here? What if 'url'
> is in the cache, but its signature is not. It looks like in this case
> we do not free 'filepath' anywhere.
> 

The function returns a list of filepaths for where each file was
downloaded to. The caller then frees it.


More information about the pacman-dev mailing list