[systemd-commits] 5 commits - src/journal
Lennart Poettering
lennart at kemper.freedesktop.org
Thu Aug 16 18:31:10 PDT 2012
src/journal/journal-authenticate.c | 10 +--
src/journal/journal-file.c | 25 ++++++---
src/journal/journal-verify.c | 94 ++++++++++++++++++++++++-------------
src/journal/journal-verify.h | 2
src/journal/journalctl.c | 13 ++++-
src/journal/test-journal-verify.c | 15 +++++
6 files changed, 108 insertions(+), 51 deletions(-)
New commits:
commit 6c7be122acd666d4e93541179d89747aa12efb67
Author: Lennart Poettering <lennart at poettering.net>
Date: Fri Aug 17 03:30:22 2012 +0200
journal: after verification output validated time range
diff --git a/src/journal/journal-verify.c b/src/journal/journal-verify.c
index 598fc9b..f9a930e 100644
--- a/src/journal/journal-verify.c
+++ b/src/journal/journal-verify.c
@@ -36,8 +36,6 @@
/* FIXME:
*
* - write bit mucking test
- * - tag timestamps should be between entry timestamps
- * - output validated time ranges
* - evolve key even if nothing happened in regular intervals
*
* - Allow building without libgcrypt
@@ -652,7 +650,10 @@ static int journal_file_parse_verification_key(JournalFile *f, const char *key)
return 0;
}
-int journal_file_verify(JournalFile *f, const char *key) {
+int journal_file_verify(
+ JournalFile *f,
+ const char *key,
+ usec_t *first_validated, usec_t *last_validated, usec_t *last_contained) {
int r;
Object *o;
uint64_t p = 0, last_tag = 0, last_epoch = 0, last_tag_realtime = 0;
@@ -749,6 +750,12 @@ int journal_file_verify(JournalFile *f, const char *key) {
break;
case OBJECT_ENTRY:
+ if ((le32toh(f->header->compatible_flags) & HEADER_COMPATIBLE_SEALED) && n_tags <= 0) {
+ log_error("First entry before first tag at %llu", (unsigned long long) p);
+ r = -EBADMSG;
+ goto fail;
+ }
+
r = write_uint64(entry_fd, p);
if (r < 0)
goto fail;
@@ -854,7 +861,7 @@ int journal_file_verify(JournalFile *f, const char *key) {
break;
case OBJECT_TAG: {
- uint64_t q;
+ uint64_t q, rt;
if (!(le32toh(f->header->compatible_flags) & HEADER_COMPATIBLE_SEALED)) {
log_error("Tag object in file without sealing at %llu", (unsigned long long) p);
@@ -876,8 +883,8 @@ int journal_file_verify(JournalFile *f, const char *key) {
goto fail;
}
- last_tag_realtime = (o->tag.epoch + 1) * f->fss_interval_usec + f->fss_start_usec;
- if (entry_realtime_set && entry_realtime >= last_tag_realtime) {
+ rt = (o->tag.epoch + 1) * f->fss_interval_usec + f->fss_start_usec;
+ if (entry_realtime_set && entry_realtime >= rt) {
log_error("Tag/entry realtime timestamp out of synchronization at %llu", (unsigned long long) p);
r = -EBADMSG;
goto fail;
@@ -929,6 +936,8 @@ int journal_file_verify(JournalFile *f, const char *key) {
f->hmac_running = false;
last_tag = p + ALIGN64(le64toh(o->object.size));
+ last_tag_realtime = rt;
+
n_tags ++;
break;
}
@@ -1056,6 +1065,13 @@ int journal_file_verify(JournalFile *f, const char *key) {
close_nointr_nofail(entry_fd);
close_nointr_nofail(entry_array_fd);
+ if (first_validated)
+ *first_validated = le64toh(f->header->head_entry_realtime);
+ if (last_validated)
+ *last_validated = last_tag_realtime;
+ if (last_contained)
+ *last_contained = le64toh(f->header->tail_entry_realtime);
+
return 0;
fail:
diff --git a/src/journal/journal-verify.h b/src/journal/journal-verify.h
index 3ebdd5e..e4449c6 100644
--- a/src/journal/journal-verify.h
+++ b/src/journal/journal-verify.h
@@ -23,4 +23,4 @@
#include "journal-file.h"
-int journal_file_verify(JournalFile *f, const char *key);
+int journal_file_verify(JournalFile *f, const char *key, usec_t *first_validated, usec_t *last_validated, usec_t *last_contained);
diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c
index 0df8ce5..5c21ab0 100644
--- a/src/journal/journalctl.c
+++ b/src/journal/journalctl.c
@@ -618,21 +618,30 @@ static int verify(sd_journal *j) {
HASHMAP_FOREACH(f, j->files, i) {
int k;
+ usec_t from, to, total;
#ifdef HAVE_GCRYPT
if (!arg_verify_key && journal_file_fss_enabled(f))
log_warning("Journal file %s has sealing enabled but verification key has not been passed using --verify-key=.", f->path);
#endif
- k = journal_file_verify(f, arg_verify_key);
+ k = journal_file_verify(f, arg_verify_key, &from, &to, &total);
if (k == -EINVAL) {
/* If the key was invalid give up right-away. */
return k;
} else if (k < 0) {
log_warning("FAIL: %s (%s)", f->path, strerror(-k));
r = k;
- } else
+ } else {
+ char a[FORMAT_TIMESTAMP_MAX], b[FORMAT_TIMESTAMP_MAX], c[FORMAT_TIMESPAN_MAX];
log_info("PASS: %s", f->path);
+
+ if (journal_file_fss_enabled(f))
+ log_info("=> Validated from %s to %s, %s missing",
+ format_timestamp(a, sizeof(a), from),
+ format_timestamp(b, sizeof(b), to),
+ format_timespan(c, sizeof(c), total > to ? total - to : 0));
+ }
}
return r;
diff --git a/src/journal/test-journal-verify.c b/src/journal/test-journal-verify.c
index 9a99bcb..df0a5dd 100644
--- a/src/journal/test-journal-verify.c
+++ b/src/journal/test-journal-verify.c
@@ -36,6 +36,10 @@ int main(int argc, char *argv[]) {
unsigned n;
JournalFile *f;
const char *verification_key = argv[1];
+ usec_t from, to, total;
+ char a[FORMAT_TIMESTAMP_MAX];
+ char b[FORMAT_TIMESTAMP_MAX];
+ char c[FORMAT_TIMESPAN_MAX];
log_set_max_level(LOG_DEBUG);
@@ -71,7 +75,13 @@ int main(int argc, char *argv[]) {
journal_file_print_header(f);
- assert_se(journal_file_verify(f, verification_key) >= 0);
+ assert_se(journal_file_verify(f, verification_key, &from, &to, &total) >= 0);
+
+ log_info("=> Validated from %s to %s, %s missing",
+ format_timestamp(a, sizeof(a), from),
+ format_timestamp(b, sizeof(b), to),
+ format_timespan(c, sizeof(c), total > to ? total - to : 0));
+
journal_file_close(f);
log_info("Exiting...");
commit 356fe3e6c623c831050c835782aec9e50f6262ba
Author: Lennart Poettering <lennart at poettering.net>
Date: Fri Aug 17 03:01:07 2012 +0200
journal: reword verification messages a bit
diff --git a/src/journal/journal-verify.c b/src/journal/journal-verify.c
index 8b71d03..598fc9b 100644
--- a/src/journal/journal-verify.c
+++ b/src/journal/journal-verify.c
@@ -289,7 +289,7 @@ static int entry_points_to_data(
if (le64toh(o->entry_array.items[j]) == entry_p)
return 0;
- a = le64toh(o->entry_array.next_entry_array_offset);;
+ a = le64toh(o->entry_array.next_entry_array_offset);
}
return 0;
@@ -325,12 +325,12 @@ static int verify_data(
uint64_t next, m, j;
if (a == 0) {
- log_error("Array chain too short at %llu.", (unsigned long long) p);
+ log_error("Array chain too short at %llu", (unsigned long long) p);
return -EBADMSG;
}
if (!contains_uint64(f->mmap, entry_array_fd, n_entry_arrays, a)) {
- log_error("Invalid array at %llu.", (unsigned long long) p);
+ log_error("Invalid array at %llu", (unsigned long long) p);
return -EBADMSG;
}
@@ -340,7 +340,7 @@ static int verify_data(
next = le64toh(o->entry_array.next_entry_array_offset);
if (next != 0 && next <= a) {
- log_error("Array chain has cycle at %llu.", (unsigned long long) p);
+ log_error("Array chain has cycle at %llu", (unsigned long long) p);
return -EBADMSG;
}
@@ -349,7 +349,7 @@ static int verify_data(
q = le64toh(o->entry_array.items[j]);
if (q <= last) {
- log_error("Data object's entry array not sorted at %llu.", (unsigned long long) p);
+ log_error("Data object's entry array not sorted at %llu", (unsigned long long) p);
return -EBADMSG;
}
last = q;
@@ -398,7 +398,7 @@ static int verify_hash_table(
uint64_t next;
if (!contains_uint64(f->mmap, data_fd, n_data, p)) {
- log_error("Invalid data object at hash entry %llu of %llu.",
+ log_error("Invalid data object at hash entry %llu of %llu",
(unsigned long long) i, (unsigned long long) n);
return -EBADMSG;
}
@@ -409,13 +409,13 @@ static int verify_hash_table(
next = le64toh(o->data.next_hash_offset);
if (next != 0 && next <= p) {
- log_error("Hash chain has a cycle in hash entry %llu of %llu.",
+ log_error("Hash chain has a cycle in hash entry %llu of %llu",
(unsigned long long) i, (unsigned long long) n);
return -EBADMSG;
}
if (le64toh(o->data.hash) % n != i) {
- log_error("Hash value mismatch in hash entry %llu of %llu.",
+ log_error("Hash value mismatch in hash entry %llu of %llu",
(unsigned long long) i, (unsigned long long) n);
return -EBADMSG;
}
@@ -429,7 +429,7 @@ static int verify_hash_table(
}
if (last != le64toh(f->data_hash_table[i].tail_hash_offset)) {
- log_error("Tail hash pointer mismatch in hash table.");
+ log_error("Tail hash pointer mismatch in hash table");
return -EBADMSG;
}
}
@@ -483,8 +483,8 @@ static int verify_entry(
h = le64toh(o->entry.items[i].hash);
if (!contains_uint64(f->mmap, data_fd, n_data, q)) {
- log_error("Invalid data object at entry %llu.",
- (unsigned long long) o);
+ log_error("Invalid data object at entry %llu",
+ (unsigned long long) p);
return -EBADMSG;
}
@@ -493,7 +493,7 @@ static int verify_entry(
return r;
if (le64toh(u->data.hash) != h) {
- log_error("Hash mismatch for data object at entry %llu.",
+ log_error("Hash mismatch for data object at entry %llu",
(unsigned long long) p);
return -EBADMSG;
}
@@ -502,7 +502,7 @@ static int verify_entry(
if (r < 0)
return r;
if (r == 0) {
- log_error("Data object missing from hash at entry %llu.",
+ log_error("Data object missing from hash at entry %llu",
(unsigned long long) p);
return -EBADMSG;
}
@@ -536,13 +536,13 @@ static int verify_entry_array(
draw_progress(0x8000 + (0x3FFF * i / n), last_usec);
if (a == 0) {
- log_error("Array chain too short at %llu of %llu.",
+ log_error("Array chain too short at %llu of %llu",
(unsigned long long) i, (unsigned long long) n);
return -EBADMSG;
}
if (!contains_uint64(f->mmap, entry_array_fd, n_entry_arrays, a)) {
- log_error("Invalid array at %llu of %llu.",
+ log_error("Invalid array at %llu of %llu",
(unsigned long long) i, (unsigned long long) n);
return -EBADMSG;
}
@@ -553,7 +553,7 @@ static int verify_entry_array(
next = le64toh(o->entry_array.next_entry_array_offset);
if (next != 0 && next <= a) {
- log_error("Array chain has cycle at %llu of %llu.",
+ log_error("Array chain has cycle at %llu of %llu",
(unsigned long long) i, (unsigned long long) n);
return -EBADMSG;
}
@@ -564,14 +564,14 @@ static int verify_entry_array(
p = le64toh(o->entry_array.items[j]);
if (p <= last) {
- log_error("Entry array not sorted at %llu of %llu.",
+ log_error("Entry array not sorted at %llu of %llu",
(unsigned long long) i, (unsigned long long) n);
return -EBADMSG;
}
last = p;
if (!contains_uint64(f->mmap, entry_fd, n_entries, p)) {
- log_error("Invalid array entry at %llu of %llu.",
+ log_error("Invalid array entry at %llu of %llu",
(unsigned long long) i, (unsigned long long) n);
return -EBADMSG;
}
@@ -714,7 +714,7 @@ int journal_file_verify(JournalFile *f, const char *key) {
}
if (le64toh(f->header->tail_object_offset) < p) {
- log_error("Invalid tail object pointer.");
+ log_error("Invalid tail object pointer");
r = -EBADMSG;
goto fail;
}
@@ -729,7 +729,7 @@ int journal_file_verify(JournalFile *f, const char *key) {
if (o->object.flags & OBJECT_COMPRESSED &&
!(le32toh(f->header->incompatible_flags) & HEADER_INCOMPATIBLE_COMPRESSED)) {
- log_error("Compressed object without compression at %llu", (unsigned long long) p);
+ log_error("Compressed object in file without compression at %llu", (unsigned long long) p);
r = -EBADMSG;
goto fail;
}
@@ -761,7 +761,7 @@ int journal_file_verify(JournalFile *f, const char *key) {
if (!entry_seqnum_set &&
le64toh(o->entry.seqnum) != le64toh(f->header->head_entry_seqnum)) {
- log_error("Head entry sequence number incorrect");
+ log_error("Head entry sequence number incorrect at %llu", (unsigned long long) p);
r = -EBADMSG;
goto fail;
}
@@ -810,7 +810,7 @@ int journal_file_verify(JournalFile *f, const char *key) {
if (le64toh(f->header->data_hash_table_offset) != p + offsetof(HashTableObject, items) ||
le64toh(f->header->data_hash_table_size) != le64toh(o->object.size) - offsetof(HashTableObject, items)) {
- log_error("Header fields for data hash table invalid.");
+ log_error("Header fields for data hash table invalid");
r = -EBADMSG;
goto fail;
}
@@ -827,7 +827,7 @@ int journal_file_verify(JournalFile *f, const char *key) {
if (le64toh(f->header->field_hash_table_offset) != p + offsetof(HashTableObject, items) ||
le64toh(f->header->field_hash_table_size) != le64toh(o->object.size) - offsetof(HashTableObject, items)) {
- log_error("Header fields for field hash table invalid.");
+ log_error("Header fields for field hash table invalid");
r = -EBADMSG;
goto fail;
}
@@ -857,7 +857,7 @@ int journal_file_verify(JournalFile *f, const char *key) {
uint64_t q;
if (!(le32toh(f->header->compatible_flags) & HEADER_COMPATIBLE_SEALED)) {
- log_error("Tag object without sealing at %llu", (unsigned long long) p);
+ log_error("Tag object in file without sealing at %llu", (unsigned long long) p);
r = -EBADMSG;
goto fail;
}
commit 7b5fd91c543fe2d62d9decfa1737f8e17c0976b2
Author: Lennart Poettering <lennart at poettering.net>
Date: Fri Aug 17 03:00:09 2012 +0200
journal: ensure that entries and tags are properly ordered
diff --git a/src/journal/journal-verify.c b/src/journal/journal-verify.c
index cfd6d40..8b71d03 100644
--- a/src/journal/journal-verify.c
+++ b/src/journal/journal-verify.c
@@ -646,7 +646,7 @@ static int journal_file_parse_verification_key(JournalFile *f, const char *key)
f->fsprg_seed = seed;
f->fsprg_seed_size = seed_size;
- f->fss_start_usec = start;
+ f->fss_start_usec = start * interval;
f->fss_interval_usec = interval;
return 0;
@@ -655,7 +655,7 @@ static int journal_file_parse_verification_key(JournalFile *f, const char *key)
int journal_file_verify(JournalFile *f, const char *key) {
int r;
Object *o;
- uint64_t p = 0, last_tag = 0, last_epoch = 0;
+ uint64_t p = 0, last_tag = 0, last_epoch = 0, last_tag_realtime = 0;
uint64_t entry_seqnum = 0, entry_monotonic = 0, entry_realtime = 0;
sd_id128_t entry_boot_id;
bool entry_seqnum_set = false, entry_monotonic_set = false, entry_realtime_set = false, found_main_entry_array = false;
@@ -753,6 +753,12 @@ int journal_file_verify(JournalFile *f, const char *key) {
if (r < 0)
goto fail;
+ if (last_tag_realtime > le64toh(o->entry.realtime)) {
+ log_error("Older entry after newer tag at %llu", (unsigned long long) p);
+ r = -EBADMSG;
+ goto fail;
+ }
+
if (!entry_seqnum_set &&
le64toh(o->entry.seqnum) != le64toh(f->header->head_entry_seqnum)) {
log_error("Head entry sequence number incorrect");
@@ -870,6 +876,13 @@ int journal_file_verify(JournalFile *f, const char *key) {
goto fail;
}
+ last_tag_realtime = (o->tag.epoch + 1) * f->fss_interval_usec + f->fss_start_usec;
+ if (entry_realtime_set && entry_realtime >= last_tag_realtime) {
+ log_error("Tag/entry realtime timestamp out of synchronization at %llu", (unsigned long long) p);
+ r = -EBADMSG;
+ goto fail;
+ }
+
/* OK, now we know the epoch. So let's now set
* it, and calculate the HMAC for everything
* since the last tag. */
commit 3223f44f2312d01113a9c51f898528041cc7bd8d
Author: Lennart Poettering <lennart at poettering.net>
Date: Fri Aug 17 02:29:20 2012 +0200
journal: show new header fields in header dump
diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
index 76bf0e5..4d7a6ff 100644
--- a/src/journal/journal-file.c
+++ b/src/journal/journal-file.c
@@ -1885,21 +1885,21 @@ void journal_file_print_header(JournalFile *f) {
"Arena size: %llu\n"
"Data Hash Table Size: %llu\n"
"Field Hash Table Size: %llu\n"
- "Objects: %llu\n"
- "Entry Objects: %llu\n"
"Rotate Suggested: %s\n"
"Head Sequential Number: %llu\n"
"Tail Sequential Number: %llu\n"
"Head Realtime Timestamp: %s\n"
- "Tail Realtime Timestamp: %s\n",
+ "Tail Realtime Timestamp: %s\n"
+ "Objects: %llu\n"
+ "Entry Objects: %llu\n",
f->path,
sd_id128_to_string(f->header->file_id, a),
sd_id128_to_string(f->header->machine_id, b),
sd_id128_to_string(f->header->boot_id, c),
sd_id128_to_string(f->header->seqnum_id, c),
- f->header->state == STATE_OFFLINE ? "offline" :
- f->header->state == STATE_ONLINE ? "online" :
- f->header->state == STATE_ARCHIVED ? "archived" : "unknown",
+ f->header->state == STATE_OFFLINE ? "OFFLINE" :
+ f->header->state == STATE_ONLINE ? "ONLINE" :
+ f->header->state == STATE_ARCHIVED ? "ARCHIVED" : "UNKNOWN",
(f->header->compatible_flags & HEADER_COMPATIBLE_SEALED) ? " SEALED" : "",
(f->header->compatible_flags & ~HEADER_COMPATIBLE_SEALED) ? " ???" : "",
(f->header->incompatible_flags & HEADER_INCOMPATIBLE_COMPRESSED) ? " COMPRESSED" : "",
@@ -1908,13 +1908,13 @@ void journal_file_print_header(JournalFile *f) {
(unsigned long long) le64toh(f->header->arena_size),
(unsigned long long) le64toh(f->header->data_hash_table_size) / sizeof(HashItem),
(unsigned long long) le64toh(f->header->field_hash_table_size) / sizeof(HashItem),
- (unsigned long long) le64toh(f->header->n_objects),
- (unsigned long long) le64toh(f->header->n_entries),
yes_no(journal_file_rotate_suggested(f)),
(unsigned long long) le64toh(f->header->head_entry_seqnum),
(unsigned long long) le64toh(f->header->tail_entry_seqnum),
format_timestamp(x, sizeof(x), le64toh(f->header->head_entry_realtime)),
- format_timestamp(y, sizeof(y), le64toh(f->header->tail_entry_realtime)));
+ format_timestamp(y, sizeof(y), le64toh(f->header->tail_entry_realtime)),
+ (unsigned long long) le64toh(f->header->n_objects),
+ (unsigned long long) le64toh(f->header->n_entries));
if (JOURNAL_HEADER_CONTAINS(f->header, n_data))
printf("Data Objects: %llu\n"
@@ -1927,6 +1927,13 @@ void journal_file_print_header(JournalFile *f) {
"Field Hash Table Fill: %.1f%%\n",
(unsigned long long) le64toh(f->header->n_fields),
100.0 * (double) le64toh(f->header->n_fields) / ((double) (le64toh(f->header->field_hash_table_size) / sizeof(HashItem))));
+
+ if (JOURNAL_HEADER_CONTAINS(f->header, n_tags))
+ printf("Tag Objects: %llu\n",
+ (unsigned long long) le64toh(f->header->n_tags));
+ if (JOURNAL_HEADER_CONTAINS(f->header, n_entry_arrays))
+ printf("Entry Array Objects: %llu\n",
+ (unsigned long long) le64toh(f->header->n_entry_arrays));
}
int journal_file_open(
diff --git a/src/journal/journal-verify.c b/src/journal/journal-verify.c
index 9907c5f..cfd6d40 100644
--- a/src/journal/journal-verify.c
+++ b/src/journal/journal-verify.c
@@ -38,7 +38,7 @@
* - write bit mucking test
* - tag timestamps should be between entry timestamps
* - output validated time ranges
- * - add missing fields to journal header dump
+ * - evolve key even if nothing happened in regular intervals
*
* - Allow building without libgcrypt
* - check with sparse
diff --git a/src/journal/test-journal-verify.c b/src/journal/test-journal-verify.c
index 8a7d998..9a99bcb 100644
--- a/src/journal/test-journal-verify.c
+++ b/src/journal/test-journal-verify.c
@@ -68,6 +68,9 @@ int main(int argc, char *argv[]) {
log_info("Verifying...");
assert_se(journal_file_open("test.journal", O_RDONLY, 0666, false, false, NULL, NULL, NULL, &f) == 0);
+
+ journal_file_print_header(f);
+
assert_se(journal_file_verify(f, verification_key) >= 0);
journal_file_close(f);
commit e627440b41bb0284e4892f7aa9d84c77972487e2
Author: Lennart Poettering <lennart at poettering.net>
Date: Fri Aug 17 01:19:32 2012 +0200
journal: don't write tag objects if nothing has been written since the last time
diff --git a/src/journal/journal-authenticate.c b/src/journal/journal-authenticate.c
index ae64d3c..9853edb 100644
--- a/src/journal/journal-authenticate.c
+++ b/src/journal/journal-authenticate.c
@@ -51,8 +51,6 @@ int journal_file_append_tag(JournalFile *f) {
if (!f->hmac_running)
return 0;
- log_debug("Writing tag for epoch %llu\n", (unsigned long long) FSPRG_GetEpoch(f->fsprg_state));
-
assert(f->hmac);
r = journal_file_append_object(f, OBJECT_TAG, sizeof(struct TagObject), &o, &p);
@@ -62,6 +60,10 @@ int journal_file_append_tag(JournalFile *f) {
o->tag.seqnum = htole64(journal_file_tag_seqnum(f));
o->tag.epoch = htole64(FSPRG_GetEpoch(f->fsprg_state));
+ log_debug("Writing tag %llu for epoch %llu\n",
+ (unsigned long long) le64toh(o->tag.seqnum),
+ (unsigned long long) FSPRG_GetEpoch(f->fsprg_state));
+
/* Add the tag object itself, so that we can protect its
* header. This will exclude the actual hash value in it */
r = journal_file_hmac_put_object(f, OBJECT_TAG, p);
@@ -221,10 +223,6 @@ int journal_file_maybe_append_tag(JournalFile *f, uint64_t realtime) {
if (r < 0)
return r;
- r = journal_file_hmac_start(f);
- if (r < 0)
- return r;
-
return 0;
}
diff --git a/src/journal/journal-verify.c b/src/journal/journal-verify.c
index 8eefb84..9907c5f 100644
--- a/src/journal/journal-verify.c
+++ b/src/journal/journal-verify.c
@@ -35,7 +35,6 @@
/* FIXME:
*
- * - write tag only if non-tag objects have been written
* - write bit mucking test
* - tag timestamps should be between entry timestamps
* - output validated time ranges
@@ -857,6 +856,8 @@ int journal_file_verify(JournalFile *f, const char *key) {
goto fail;
}
+ log_debug("Checking tag %llu..", (unsigned long long) le64toh(o->tag.seqnum));
+
if (le64toh(o->tag.seqnum) != n_tags + 1) {
log_error("Tag sequence number out of synchronization at %llu", (unsigned long long) p);
r = -EBADMSG;
More information about the systemd-commits
mailing list