chiark / gitweb /
journald: avoid logging to kmsg in the normal paths
[elogind.git] / src / journal / journal-verify.c
index 8604b6e7cb97cae6b6001e23d0413b0478451b12..5d134bdb9763d7c495f0c7708d40119b8b2d1835 100644 (file)
@@ -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);
         }
 
@@ -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)