X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fjournal%2Fjournal-file.c;h=9cec140f58032a158bffa76cb3468efd15a73e33;hp=a60a896c2f3ad7370f43abf8ba97514d0c9f20d2;hb=8db4213e7b38ebc54bfdc7215991cc23b9580e3a;hpb=7ea07dcddafe573c699fc48171b57b912897e7e2 diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c index a60a896c2..9cec140f5 100644 --- a/src/journal/journal-file.c +++ b/src/journal/journal-file.c @@ -67,9 +67,12 @@ void journal_file_close(JournalFile *f) { assert(f); - if (f->header && f->writable) - f->header->state = STATE_OFFLINE; + if (f->header) { + if (f->writable) + f->header->state = STATE_OFFLINE; + munmap(f->header, PAGE_ALIGN(sizeof(Header))); + } for (t = 0; t < _WINDOW_MAX; t++) if (f->windows[t].ptr) @@ -96,7 +99,7 @@ static int journal_file_init_header(JournalFile *f, JournalFile *template) { zero(h); memcpy(h.signature, signature, 8); - h.arena_offset = htole64(ALIGN64(sizeof(h))); + h.header_size = htole64(ALIGN64(sizeof(h))); r = sd_id128_randomize(&h.file_id); if (r < 0) @@ -158,7 +161,10 @@ static int journal_file_verify_header(JournalFile *f) { return -EPROTONOSUPPORT; #endif - if ((uint64_t) f->last_stat.st_size < (le64toh(f->header->arena_offset) + le64toh(f->header->arena_size))) + if (f->header->header_size != htole64(ALIGN64(sizeof(*(f->header))))) + return -EBADMSG; + + if ((uint64_t) f->last_stat.st_size < (le64toh(f->header->header_size) + le64toh(f->header->arena_size))) return -ENODATA; if (f->writable) { @@ -188,6 +194,7 @@ static int journal_file_verify_header(JournalFile *f) { static int journal_file_allocate(JournalFile *f, uint64_t offset, uint64_t size) { uint64_t old_size, new_size; + int r; assert(f); @@ -196,12 +203,12 @@ static int journal_file_allocate(JournalFile *f, uint64_t offset, uint64_t size) * ourselves */ old_size = - le64toh(f->header->arena_offset) + + le64toh(f->header->header_size) + le64toh(f->header->arena_size); new_size = PAGE_ALIGN(offset + size); - if (new_size < le64toh(f->header->arena_offset)) - new_size = le64toh(f->header->arena_offset); + if (new_size < le64toh(f->header->header_size)) + new_size = le64toh(f->header->header_size); if (new_size <= old_size) return 0; @@ -232,13 +239,14 @@ static int journal_file_allocate(JournalFile *f, uint64_t offset, uint64_t size) /* Note that the glibc fallocate() fallback is very inefficient, hence we try to minimize the allocation area as we can. */ - if (posix_fallocate(f->fd, old_size, new_size - old_size) < 0) - return -errno; + r = posix_fallocate(f->fd, old_size, new_size - old_size); + if (r != 0) + return -r; if (fstat(f->fd, &f->last_stat) < 0) return -errno; - f->header->arena_size = htole64(new_size - le64toh(f->header->arena_offset)); + f->header->arena_size = htole64(new_size - le64toh(f->header->header_size)); return 0; } @@ -452,7 +460,7 @@ static int journal_file_append_object(JournalFile *f, int type, uint64_t size, O p = le64toh(f->header->tail_object_offset); if (p == 0) - p = le64toh(f->header->arena_offset); + p = le64toh(f->header->header_size); else { r = journal_file_move_to_object(f, -1, p, &tail); if (r < 0) @@ -588,7 +596,7 @@ static int journal_file_link_data(JournalFile *f, Object *o, uint64_t offset, ui o->data.n_entries = 0; h = hash % (le64toh(f->header->data_hash_table_size) / sizeof(HashItem)); - p = le64toh(f->data_hash_table[h].head_hash_offset); + p = le64toh(f->data_hash_table[h].tail_hash_offset); if (p == 0) { /* Only entry in the hash table is easy */ f->data_hash_table[h].head_hash_offset = htole64(offset); @@ -1660,7 +1668,7 @@ void journal_file_dump(JournalFile *f) { (unsigned long) le64toh(f->header->n_objects), (unsigned long) le64toh(f->header->n_entries)); - p = le64toh(f->header->arena_offset); + p = le64toh(f->header->header_size); while (p != 0) { r = journal_file_move_to_object(f, -1, p, &o); if (r < 0) @@ -1694,6 +1702,10 @@ void journal_file_dump(JournalFile *f) { case OBJECT_ENTRY_ARRAY: printf("Type: OBJECT_ENTRY_ARRAY\n"); break; + + case OBJECT_SIGNATURE: + printf("Type: OBJECT_SIGNATURE\n"); + break; } if (o->object.flags & OBJECT_COMPRESSED)