]> git.ipfire.org Git - pakfire.git/commitdiff
downloader: Compare digests and try re-download if they don't match
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 8 Sep 2021 12:50:35 +0000 (12:50 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 8 Sep 2021 12:50:35 +0000 (12:50 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/downloader.c

index 911c17f32754a32e20267dc23cba29042cf75a3c..2bbba0c5311ef8b8470f7ad072b86e6b64fafe75 100644 (file)
@@ -600,7 +600,27 @@ static int pakfire_transfer_done(struct pakfire_downloader* downloader,
                free(hexdigest);
        }
 
-       // XXX check if digest matches
+       // Check if digests match
+       if (transfer->evp) {
+               r = CRYPTO_memcmp(transfer->computed_digest, transfer->expected_digest,
+                       transfer->computed_digest_length);
+
+               // If they don't match, log an error and try again
+               if (r) {
+                       char* computed_hexdigest = __pakfire_hexlify(transfer->computed_digest,
+                               transfer->computed_digest_length);
+                       char* expected_hexdigest = __pakfire_hexlify(transfer->expected_digest,
+                               transfer->expected_digest_length);
+
+                       ERROR(downloader->pakfire, "Download checksum didn't match:\n  Expected: %s\n  Computed: %s\n",
+                               expected_hexdigest, computed_hexdigest);
+
+                       free(computed_hexdigest);
+                       free(expected_hexdigest);
+
+                       return pakfire_transfer_fail(downloader, transfer, 0);
+               }
+       }
 
        switch (protocol) {
                case CURLPROTO_FILE: