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