chiark / gitweb /
journald: don't reposition window if we don't have to
[elogind.git] / src / journal / journal-file.c
index 06de2acc50dc9d74317438c9b66ec789c3c1a82c..e55162ab2c0361babbf941d9368b2e8502ad5059 100644 (file)
@@ -221,10 +221,16 @@ static int journal_file_verify_header(JournalFile *f) {
         if (le64toh(f->header->tail_object_offset) > (le64toh(f->header->header_size) + le64toh(f->header->arena_size)))
                 return -ENODATA;
 
-        if (!VALID64(f->header->data_hash_table_offset) ||
-            !VALID64(f->header->field_hash_table_offset) ||
-            !VALID64(f->header->tail_object_offset) ||
-            !VALID64(f->header->entry_array_offset))
+        if (!VALID64(le64toh(f->header->data_hash_table_offset)) ||
+            !VALID64(le64toh(f->header->field_hash_table_offset)) ||
+            !VALID64(le64toh(f->header->tail_object_offset)) ||
+            !VALID64(le64toh(f->header->entry_array_offset)))
+                return -ENODATA;
+
+        if (le64toh(f->header->data_hash_table_offset) < le64toh(f->header->header_size) ||
+            le64toh(f->header->field_hash_table_offset) < le64toh(f->header->header_size) ||
+            le64toh(f->header->tail_object_offset) < le64toh(f->header->header_size) ||
+            le64toh(f->header->entry_array_offset) < le64toh(f->header->header_size))
                 return -ENODATA;
 
         if (f->writable) {
@@ -323,6 +329,9 @@ static int journal_file_move_to(JournalFile *f, int context, bool keep_always, u
         assert(f);
         assert(ret);
 
+        if (size <= 0)
+                return -EINVAL;
+
         /* Avoid SIGBUS on invalid accesses */
         if (offset + size > (uint64_t) f->last_stat.st_size) {
                 /* Hmm, out of range? Let's refresh the fstat() data
@@ -766,18 +775,18 @@ static int journal_file_append_data(
         if (r < 0)
                 return r;
 
-#ifdef HAVE_GCRYPT
-        r = journal_file_hmac_put_object(f, OBJECT_DATA, p);
-        if (r < 0)
-                return r;
-#endif
-
         /* The linking might have altered the window, so let's
          * refresh our pointer */
         r = journal_file_move_to_object(f, OBJECT_DATA, p, &o);
         if (r < 0)
                 return r;
 
+#ifdef HAVE_GCRYPT
+        r = journal_file_hmac_put_object(f, OBJECT_DATA, o, p);
+        if (r < 0)
+                return r;
+#endif
+
         if (ret)
                 *ret = o;
 
@@ -857,7 +866,7 @@ static int link_entry_into_array(JournalFile *f,
                 return r;
 
 #ifdef HAVE_GCRYPT
-        r = journal_file_hmac_put_object(f, OBJECT_ENTRY_ARRAY, q);
+        r = journal_file_hmac_put_object(f, OBJECT_ENTRY_ARRAY, o, q);
         if (r < 0)
                 return r;
 #endif
@@ -1003,7 +1012,7 @@ static int journal_file_append_entry_internal(
         o->entry.boot_id = f->header->boot_id;
 
 #ifdef HAVE_GCRYPT
-        r = journal_file_hmac_put_object(f, OBJECT_ENTRY, np);
+        r = journal_file_hmac_put_object(f, OBJECT_ENTRY, o, np);
         if (r < 0)
                 return r;
 #endif
@@ -2012,8 +2021,12 @@ int journal_file_open(
         f->flags = flags;
         f->prot = prot_from_flags(flags);
         f->writable = (flags & O_ACCMODE) != O_RDONLY;
+#ifdef HAVE_XZ
         f->compress = compress;
+#endif
+#ifdef HAVE_GCRYPT
         f->seal = seal;
+#endif
 
         if (mmap_cache)
                 f->mmap = mmap_cache_ref(mmap_cache);
@@ -2048,9 +2061,11 @@ int journal_file_open(
 #ifdef HAVE_GCRYPT
                 /* Try to load the FSPRG state, and if we can't, then
                  * just don't do sealing */
-                r = journal_file_fss_load(f);
-                if (r < 0)
-                        f->seal = false;
+                if (f->seal) {
+                        r = journal_file_fss_load(f);
+                        if (r < 0)
+                                f->seal = false;
+                }
 #endif
 
                 r = journal_file_init_header(f, template);