X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fjournal%2Fjournal-verify.c;h=629b2389bc5ea24bc0c18cade52e3635f91825ea;hb=f2cc3753ce0e85960f0299855c3b98ba60efa580;hp=8604b6e7cb97cae6b6001e23d0413b0478451b12;hpb=89fef99014662a5a63e7deaedd6292b7fb4ab2f8;p=elogind.git diff --git a/src/journal/journal-verify.c b/src/journal/journal-verify.c index 8604b6e7c..629b2389b 100644 --- a/src/journal/journal-verify.c +++ b/src/journal/journal-verify.c @@ -63,6 +63,7 @@ static int journal_file_object_verify(JournalFile *f, Object *o) { h1 = le64toh(o->data.hash); if (o->object.flags & OBJECT_COMPRESSED) { +#ifdef HAVE_XZ void *b = NULL; uint64_t alloc = 0, b_size; @@ -73,6 +74,9 @@ static int journal_file_object_verify(JournalFile *f, Object *o) { h2 = hash64(b, b_size); free(b); +#else + return -EPROTONOSUPPORT; +#endif } else h2 = hash64(o->data.payload, le64toh(o->object.size) - offsetof(Object, data.payload)); @@ -249,7 +253,7 @@ static int contains_uint64(MMapCache *m, int fd, uint64_t n, uint64_t p) { c = (a + b) / 2; - r = mmap_cache_get(m, fd, PROT_READ|PROT_WRITE, 0, c * sizeof(uint64_t), sizeof(uint64_t), (void **) &z); + r = mmap_cache_get(m, fd, PROT_READ|PROT_WRITE, 0, false, c * sizeof(uint64_t), sizeof(uint64_t), NULL, (void **) &z); if (r < 0) return r; @@ -261,9 +265,8 @@ static int contains_uint64(MMapCache *m, int fd, uint64_t n, uint64_t p) { if (p < *z) b = c; - else { + else a = c; - } } return 0; @@ -309,22 +312,46 @@ static int entry_points_to_data( * main entry array has already been verified we can rely on * its consistency.*/ + i = 0; n = le64toh(f->header->n_entries); a = le64toh(f->header->entry_array_offset); - i = 0; while (i < n) { - uint64_t m, j; + uint64_t m, u; r = journal_file_move_to_object(f, OBJECT_ENTRY_ARRAY, a, &o); if (r < 0) return r; m = journal_file_entry_array_n_items(o); - for (j = 0; i < n && j < m; i++, j++) - if (le64toh(o->entry_array.items[j]) == entry_p) - return 0; + u = MIN(n - i, m); + + if (entry_p <= le64toh(o->entry_array.items[u-1])) { + uint64_t x, y, z; + + x = 0; + y = u; + + while (x < y) { + z = (x + y) / 2; + + if (le64toh(o->entry_array.items[z]) == entry_p) + return 0; + + if (x + 1 >= y) + break; + + if (entry_p < le64toh(o->entry_array.items[z])) + y = z; + else + x = z; + } + + log_error("Entry object doesn't exist in main entry array at %llu", (unsigned long long) entry_p); + return -EBADMSG; + } + i += u; a = le64toh(o->entry_array.next_entry_array_offset); } @@ -932,7 +959,7 @@ int journal_file_verify( if (r < 0) goto fail; - r = journal_file_hmac_put_object(f, -1, q); + r = journal_file_hmac_put_object(f, -1, o, q); if (r < 0) goto fail; @@ -1095,7 +1122,7 @@ int journal_file_verify( close_nointr_nofail(entry_array_fd); if (first_validated) - *first_validated = last_tag_realtime ? le64toh(f->header->head_entry_realtime) : 0; + *first_validated = last_sealed_realtime > 0 ? le64toh(f->header->head_entry_realtime) : 0; if (last_validated) *last_validated = last_sealed_realtime; if (last_contained)