int r;
/* truncate excess from the end of archives */
- r = journal_file_tail_end(f, &p);
+ r = journal_file_tail_end_by_pread(f, &p);
if (r < 0)
return log_debug_errno(r, "Failed to determine end of tail object: %m");
# pragma GCC diagnostic ignored "-Waddress-of-packed-member"
#endif
-int journal_file_tail_end(JournalFile *f, uint64_t *ret_offset) {
- Object tail;
+int journal_file_tail_end_by_pread(JournalFile *f, uint64_t *ret_offset) {
uint64_t p;
int r;
assert(f->header);
assert(ret_offset);
+ /* Same as journal_file_tail_end_by_mmap() below, but operates with pread() to avoid the mmap cache
+ * (and thus is thread safe) */
+
p = le64toh(f->header->tail_object_offset);
if (p == 0)
p = le64toh(f->header->header_size);
else {
+ Object tail;
uint64_t sz;
r = journal_file_read_object_header(f, OBJECT_UNUSED, p, &tail);
return 0;
}
+int journal_file_tail_end_by_mmap(JournalFile *f, uint64_t *ret_offset) {
+ uint64_t p;
+ int r;
+
+ assert(f);
+ assert(f->header);
+ assert(ret_offset);
+
+ /* Same as journal_file_tail_end_by_pread() above, but operates with the usual mmap logic */
+
+ p = le64toh(f->header->tail_object_offset);
+ if (p == 0)
+ p = le64toh(f->header->header_size);
+ else {
+ Object *tail;
+ uint64_t sz;
+
+ r = journal_file_move_to_object(f, OBJECT_UNUSED, p, &tail);
+ if (r < 0)
+ return r;
+
+ sz = le64toh(READ_NOW(tail->object.size));
+ if (sz > UINT64_MAX - sizeof(uint64_t) + 1)
+ return -EBADMSG;
+
+ sz = ALIGN64(sz);
+ if (p > UINT64_MAX - sz)
+ return -EBADMSG;
+
+ p += sz;
+ }
+
+ *ret_offset = p;
+
+ return 0;
+}
+
int journal_file_set_offline_thread_join(JournalFile *f) {
int r;
if (r < 0)
return r;
- r = journal_file_tail_end(f, &p);
+ r = journal_file_tail_end_by_mmap(f, &p);
if (r < 0)
return r;
int journal_file_move_to_object(JournalFile *f, ObjectType type, uint64_t offset, Object **ret);
int journal_file_read_object_header(JournalFile *f, ObjectType type, uint64_t offset, Object *ret);
-int journal_file_tail_end(JournalFile *f, uint64_t *ret_offset);
+int journal_file_tail_end_by_pread(JournalFile *f, uint64_t *ret_offset);
+int journal_file_tail_end_by_mmap(JournalFile *f, uint64_t *ret_offset);
uint64_t journal_file_entry_n_items(Object *o) _pure_;
uint64_t journal_file_entry_array_n_items(Object *o) _pure_;