You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.9 KiB
84 lines
2.9 KiB
From 0c2f52bb9b0bce392f14a38d6477e396d6fc987e Mon Sep 17 00:00:00 2001 |
|
From: Lennart Poettering <lennart@poettering.net> |
|
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 d2d5c400c..53f0550da 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;
|
|
|