]> git.ipfire.org Git - location/libloc.git/commitdiff
Check return value of fread() when reading header
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 16 Aug 2022 10:30:56 +0000 (10:30 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 16 Aug 2022 10:30:56 +0000 (10:30 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/database.c
src/writer.c

index dcb84a16a9db5a877cb2f2a06f8b356014ba7689..6d2753bd32bf766eff55952894e2d1e3f88e440e 100644 (file)
@@ -486,6 +486,8 @@ LOC_EXPORT struct loc_database* loc_database_unref(struct loc_database* db) {
 }
 
 LOC_EXPORT int loc_database_verify(struct loc_database* db, FILE* f) {
+       size_t bytes_read = 0;
+
        // Cannot do this when no signature is available
        if (!db->signature1 && !db->signature2) {
                DEBUG(db->ctx, "No signature available to verify\n");
@@ -523,7 +525,12 @@ LOC_EXPORT int loc_database_verify(struct loc_database* db, FILE* f) {
 
        // Read magic
        struct loc_database_magic magic;
-       fread(&magic, 1, sizeof(magic), db->f);
+       bytes_read = fread(&magic, 1, sizeof(magic), db->f);
+       if (bytes_read < sizeof(magic)) {
+               ERROR(db->ctx, "Could not read header: %m\n");
+               r = 1;
+               goto CLEANUP;
+       }
 
        hexdump(db->ctx, &magic, sizeof(magic));
 
@@ -538,7 +545,6 @@ LOC_EXPORT int loc_database_verify(struct loc_database* db, FILE* f) {
 
        // Read the header
        struct loc_database_header_v1 header_v1;
-       size_t bytes_read;
 
        switch (db->version) {
                case LOC_DATABASE_VERSION_1:
index 7afba868299da084a3ec89a5f02a9e32de9d8c57..9ca87cba87f35295c3f3f88a31b29f82d42a0303 100644 (file)
@@ -537,6 +537,8 @@ static int loc_database_write_countries(struct loc_writer* writer,
 static int loc_writer_create_signature(struct loc_writer* writer,
                struct loc_database_header_v1* header, FILE* f, EVP_PKEY* private_key,
                char* signature, size_t* length) {
+       size_t bytes_read = 0;
+
        DEBUG(writer->ctx, "Creating signature...\n");
 
        // Read file from the beginning
@@ -554,7 +556,12 @@ static int loc_writer_create_signature(struct loc_writer* writer,
 
        // Read magic
        struct loc_database_magic magic;
-       fread(&magic, 1, sizeof(magic), f);
+       bytes_read = fread(&magic, 1, sizeof(magic), f);
+       if (bytes_read < sizeof(magic)) {
+               ERROR(writer->ctx, "Could not read header: %m\n");
+               r = 1;
+               goto END;
+       }
 
        hexdump(writer->ctx, &magic, sizeof(magic));
 
@@ -580,7 +587,7 @@ static int loc_writer_create_signature(struct loc_writer* writer,
        // Walk through the file in chunks of 64kB
        char buffer[64 * 1024];
        while (!feof(f)) {
-               size_t bytes_read = fread(buffer, 1, sizeof(buffer), f);
+               bytes_read = fread(buffer, 1, sizeof(buffer), f);
 
                if (ferror(f)) {
                        ERROR(writer->ctx, "Error reading from file: %m\n");