chiark / gitweb /
journald: don't complain if fss key does not exist
[elogind.git] / src / journal / journal-file.c
index 697e7f3606896add66c83255386667d80ad84716..c8193baa3b517262b49b6b29c3588482b548a03a 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
@@ -1906,6 +1915,8 @@ fail:
 void journal_file_print_header(JournalFile *f) {
         char a[33], b[33], c[33];
         char x[FORMAT_TIMESTAMP_MAX], y[FORMAT_TIMESTAMP_MAX];
+        struct stat st;
+        char bytes[FORMAT_BYTES_MAX];
 
         assert(f);
 
@@ -1970,6 +1981,9 @@ void journal_file_print_header(JournalFile *f) {
         if (JOURNAL_HEADER_CONTAINS(f->header, n_entry_arrays))
                 printf("Entry Array Objects: %llu\n",
                        (unsigned long long) le64toh(f->header->n_entry_arrays));
+
+        if (fstat(f->fd, &st) >= 0)
+                printf("Disk usage: %s\n", format_bytes(bytes, sizeof(bytes), (off_t) st.st_blocks * 512ULL));
 }
 
 int journal_file_open(