From 0c2f52bb9b0bce392f14a38d6477e396d6fc987e Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 24 Jul 2015 02:00:43 +0200 Subject: [PATCH] journal: when verifying journal files, handle empty ones nicely A journal file that carries no objects should be considered valid. Cherry-picked from: 8dc37a85255f68d62f7af66696cbf6a66401fb2a Resolves: #1350232 --- src/journal/journal-verify.c | 37 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/src/journal/journal-verify.c b/src/journal/journal-verify.c index d2d5c400c1..53f0550daf 100644 --- a/src/journal/journal-verify.c +++ b/src/journal/journal-verify.c @@ -885,7 +885,11 @@ int journal_file_verify( * superficial structure, headers, hashes. */ p = le64toh(f->header->header_size); - while (p != 0) { + for (;;) { + /* Early exit if there are no objects in the file, at all */ + if (le64toh(f->header->tail_object_offset) == 0) + break; + if (show_progress) draw_progress(scale_progress(0x7FFF, p, le64toh(f->header->tail_object_offset)), &last_usec); @@ -901,9 +905,6 @@ int journal_file_verify( goto fail; } - if (p == le64toh(f->header->tail_object_offset)) - found_last = true; - n_objects ++; r = journal_file_object_verify(f, p, o); @@ -1148,13 +1149,15 @@ int journal_file_verify( n_weird ++; } - if (p == le64toh(f->header->tail_object_offset)) - p = 0; - else - p = p + ALIGN64(le64toh(o->object.size)); - } + if (p == le64toh(f->header->tail_object_offset)) { + found_last = true; + break; + } - if (!found_last) { + p = p + ALIGN64(le64toh(o->object.size)); + }; + + if (!found_last && le64toh(f->header->tail_object_offset) != 0) { error(le64toh(f->header->tail_object_offset), "tail object pointer dead"); r = -EBADMSG; goto fail; @@ -1200,19 +1203,7 @@ int journal_file_verify( goto fail; } - if (n_data_hash_tables != 1) { - error(0, "missing data hash table"); - r = -EBADMSG; - goto fail; - } - - if (n_field_hash_tables != 1) { - error(0, "missing field hash table"); - r = -EBADMSG; - goto fail; - } - - if (!found_main_entry_array) { + if (!found_main_entry_array && le64toh(f->header->entry_array_offset) != 0) { error(0, "missing entry array"); r = -EBADMSG; goto fail;