]> git.ipfire.org Git - location/libloc.git/commitdiff
database: Catch any errors from EVP_DigestVerify_Update()
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 12 Dec 2019 12:16:19 +0000 (12:16 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 12 Dec 2019 12:16:19 +0000 (12:16 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/database.c

index fcf40a03ced81ab55a022b6b2112a08b9fe68950..77c9ebd232e59a2d755ae591ab05857b7a5550d3 100644 (file)
@@ -454,7 +454,14 @@ LOC_EXPORT int loc_database_verify(struct loc_database* db, FILE* f) {
        EVP_MD_CTX* mdctx = EVP_MD_CTX_new();
 
        // Initialise hash function
-       EVP_DigestVerifyInit(mdctx, NULL, NULL, NULL, pkey);
+       r = EVP_DigestVerifyInit(mdctx, NULL, NULL, NULL, pkey);
+       if (r != 1) {
+               ERROR(db->ctx, "Error initializing signature validation: %s\n",
+                       ERR_error_string(ERR_get_error(), NULL));
+               r = 1;
+
+               goto CLEANUP;
+       }
 
        // Reset file to start
        rewind(db->f);
@@ -464,7 +471,13 @@ LOC_EXPORT int loc_database_verify(struct loc_database* db, FILE* f) {
        fread(&magic, 1, sizeof(magic), db->f);
 
        // Feed magic into the hash
-       EVP_DigestVerifyUpdate(mdctx, &magic, sizeof(magic));
+       r = EVP_DigestVerifyUpdate(mdctx, &magic, sizeof(magic));
+       if (r != 1) {
+               ERROR(db->ctx, "%s\n", ERR_error_string(ERR_get_error(), NULL));
+               r = 1;
+
+               goto CLEANUP;
+       }
 
        // Read the header
        struct loc_database_header_v0 header_v0;
@@ -480,6 +493,12 @@ LOC_EXPORT int loc_database_verify(struct loc_database* db, FILE* f) {
 
                        // Feed header into the hash
                        EVP_DigestVerifyUpdate(mdctx, &header_v0, sizeof(header_v0));
+                       if (r != 1) {
+                               ERROR(db->ctx, "%s\n", ERR_error_string(ERR_get_error(), NULL));
+                               r = 1;
+
+                               goto CLEANUP;
+                       }
                        break;
 
                default:
@@ -495,7 +514,13 @@ LOC_EXPORT int loc_database_verify(struct loc_database* db, FILE* f) {
        while (!feof(db->f)) {
                size_t bytes_read = fread(buffer, 1, sizeof(buffer), db->f);
 
-               EVP_DigestVerifyUpdate(mdctx, buffer, bytes_read);
+               r = EVP_DigestVerifyUpdate(mdctx, buffer, bytes_read);
+               if (r != 1) {
+                       ERROR(db->ctx, "%s\n", ERR_error_string(ERR_get_error(), NULL));
+                       r = 1;
+
+                       goto CLEANUP;
+               }
        }
 
        // Finish