Commit 98b2876e authored by Michael Tremer's avatar Michael Tremer

Check return value of fread() when reading header

Signed-off-by: default avatarMichael Tremer <michael.tremer@ipfire.org>
parent 2c004816
...@@ -486,6 +486,8 @@ LOC_EXPORT struct loc_database* loc_database_unref(struct loc_database* db) { ...@@ -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) { 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 // Cannot do this when no signature is available
if (!db->signature1 && !db->signature2) { if (!db->signature1 && !db->signature2) {
DEBUG(db->ctx, "No signature available to verify\n"); 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) { ...@@ -523,7 +525,12 @@ LOC_EXPORT int loc_database_verify(struct loc_database* db, FILE* f) {
// Read magic // Read magic
struct loc_database_magic 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)); hexdump(db->ctx, &magic, sizeof(magic));
...@@ -538,7 +545,6 @@ LOC_EXPORT int loc_database_verify(struct loc_database* db, FILE* f) { ...@@ -538,7 +545,6 @@ LOC_EXPORT int loc_database_verify(struct loc_database* db, FILE* f) {
// Read the header // Read the header
struct loc_database_header_v1 header_v1; struct loc_database_header_v1 header_v1;
size_t bytes_read;
switch (db->version) { switch (db->version) {
case LOC_DATABASE_VERSION_1: case LOC_DATABASE_VERSION_1:
......
...@@ -537,6 +537,8 @@ static int loc_database_write_countries(struct loc_writer* writer, ...@@ -537,6 +537,8 @@ static int loc_database_write_countries(struct loc_writer* writer,
static int loc_writer_create_signature(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, struct loc_database_header_v1* header, FILE* f, EVP_PKEY* private_key,
char* signature, size_t* length) { char* signature, size_t* length) {
size_t bytes_read = 0;
DEBUG(writer->ctx, "Creating signature...\n"); DEBUG(writer->ctx, "Creating signature...\n");
// Read file from the beginning // Read file from the beginning
...@@ -554,7 +556,12 @@ static int loc_writer_create_signature(struct loc_writer* writer, ...@@ -554,7 +556,12 @@ static int loc_writer_create_signature(struct loc_writer* writer,
// Read magic // Read magic
struct loc_database_magic 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)); hexdump(writer->ctx, &magic, sizeof(magic));
...@@ -580,7 +587,7 @@ static int loc_writer_create_signature(struct loc_writer* writer, ...@@ -580,7 +587,7 @@ static int loc_writer_create_signature(struct loc_writer* writer,
// Walk through the file in chunks of 64kB // Walk through the file in chunks of 64kB
char buffer[64 * 1024]; char buffer[64 * 1024];
while (!feof(f)) { while (!feof(f)) {
size_t bytes_read = fread(buffer, 1, sizeof(buffer), f); bytes_read = fread(buffer, 1, sizeof(buffer), f);
if (ferror(f)) { if (ferror(f)) {
ERROR(writer->ctx, "Error reading from file: %m\n"); ERROR(writer->ctx, "Error reading from file: %m\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment